Android 实现一个简单的Dagger2示例
我是使用Dagger2的新手(我总是使用Koin),我正在尝试实现一个简单的示例,但我真的不知道我缺少了什么。这就是我目前得到的 app.gradle: AppModule.kt: AppComponent.kt: App.kt: 错误:testClass==nullAndroid 实现一个简单的Dagger2示例,android,dagger-2,Android,Dagger 2,我是使用Dagger2的新手(我总是使用Koin),我正在尝试实现一个简单的示例,但我真的不知道我缺少了什么。这就是我目前得到的 app.gradle: AppModule.kt: AppComponent.kt: App.kt: 错误:testClass==null MainActivity应该扩展DaggerActivity,而不是AppCompatActivityMainActivity应该扩展DaggerActivity,而不是AppCompatActivityAppModule.kt:
MainActivity
应该扩展DaggerActivity
,而不是AppCompatActivityMainActivity
应该扩展DaggerActivity
,而不是AppCompatActivityAppModule.kt:提供应用程序上下文。无需编写@singleton@为您的Test*类提供(将了解原因)
AppComponent.kt:@Component.Builder
不推荐使用IIRC。使用@Component.Factory
。并将AndroidInjectionModule::class
替换为AndroidSupportInjectionModule::class
,因为我们使用的是dagger android支持
和android的*Compat*
东西。请参阅此处名为ActivityModule::class
的新模块
@Singleton
@Component(modules = [
ActivityModule::class
AndroidSupportInjectionModule::class,
AppModule::class
])
interface AppComponent : AndroidInjector<App> {
@Component.Factory
abstract class Factory : AndroidInjector.Factory<App>
}
App.kt:使用factory而不是builder,因为@Component.builder
已被弃用
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.factory().create(this)
}
}
MainActivity.kt:最后,从daggerappcompativity
扩展
class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
val x = testClass.getRandomValueFromCTest()
}
}
我认为这应该没有问题。有关更多参考信息,您可以在AppModule.kt上查看此文档和新的更简单的文档:提供应用程序上下文。无需编写@singleton@为您的Test*类提供(将了解原因)
AppComponent.kt:@Component.Builder
不推荐使用IIRC。使用@Component.Factory
。并将AndroidInjectionModule::class
替换为AndroidSupportInjectionModule::class
,因为我们使用的是dagger android支持
和android的*Compat*
东西。请参阅此处名为ActivityModule::class
的新模块
@Singleton
@Component(modules = [
ActivityModule::class
AndroidSupportInjectionModule::class,
AppModule::class
])
interface AppComponent : AndroidInjector<App> {
@Component.Factory
abstract class Factory : AndroidInjector.Factory<App>
}
App.kt:使用factory而不是builder,因为@Component.builder
已被弃用
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.factory().create(this)
}
}
MainActivity.kt:最后,从daggerappcompativity
扩展
class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
val x = testClass.getRandomValueFromCTest()
}
}
我认为这应该没有问题。有关更多参考,您可以查看此文档和新的更简单的文档,网址为您缺少实际的注入调用
class MainActivity : AppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
您错过了实际的注射呼叫
class MainActivity : AppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
事实上,这不是真的。它可以扩展DaggerActivity
,但不是必需的。在onCreate(/*…*/)
方法中调用AndroidInjection.injection(/*…*/)
就足够了。实际上,这不是真的。它可以扩展DaggerActivity
,但不是必需的。在onCreate(/*…*/)
方法中调用AndroidInjection.injection(/*…*/)
就足够了。
@Singleton
class TestClass @Inject constructor(private val testOperator: TestOperator) {
fun getRandomValueFromCTest(): Int = testOperator.generateRandomNumber()
}
@Singleton
class TestOperator @Inject constructor() {
fun generateRandomNumber(): Int = Random.nextInt()
}
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.factory().create(this)
}
}
@Module
interface ActivityModule {
@ContributesAndroidInjector
fun provideMainActivity(): MainActivity
}
class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
val x = testClass.getRandomValueFromCTest()
}
}
class MainActivity : AppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}