Android 实现一个简单的Dagger2示例

Android 实现一个简单的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:

我是使用Dagger2的新手(我总是使用Koin),我正在尝试实现一个简单的示例,但我真的不知道我缺少了什么。这就是我目前得到的

app.gradle:

AppModule.kt:

AppComponent.kt:

App.kt:

错误:testClass==null


MainActivity
应该扩展
DaggerActivity
,而不是
AppCompatActivity

MainActivity
应该扩展
DaggerActivity
,而不是
AppCompatActivity

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()
    }
}
我认为这应该没有问题。有关更多参考信息,您可以在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)
  }