当前位置: 首页 > 知识库问答 >
问题:

实现一个简单的Dagger2示例

谭景福
2023-03-14

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

app.gradle:

ext.daggerVersion = '2.23.2'

implementation "com.google.dagger:dagger:$daggerVersion"
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"

应用模块。kt:

@Module
class AppModule {
    @Provides
    @Singleton
    fun provideApplication(app: App): Application = app

    @Provides
    @Singleton
    fun provideTestOperator(testOperator: TestOperator) = testOperator

    @Provides
    @Singleton
    fun provideTestClass(testClass: TestClass) = testClass

}

AppComponent。kt:

@Singleton
@Component(modules = [
    AndroidInjectionModule::class,
    AppModule::class
])
interface AppComponent : AndroidInjector<App> {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(app: App): Builder
        fun build(): AppComponent
    }
}

TestClass。千吨

class TestClass @Inject constructor(private val testOperator: TestOperator) {
    fun getRandomValueFromCTest(): Int = testOperator.generateRandomNumber()
}

class TestOperator @Inject constructor() {
    fun generateRandomNumber(): Int = Random.nextInt()
}

pp.kt:

class App : DaggerApplication() {
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().application(this@App).build()
    }
}

MainActivity.kt:

class MainActivity : AppCompatActivity() {
    @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()
    }
}

错误:testClass==null

共有3个答案

宇文嘉勋
2023-03-14

MainActivity应该扩展DaggerActivity,而不是AppCompatActivity

吕灿
2023-03-14

您错过了实际的注入调用。

class MainActivity : AppCompatActivity() {
  @Inject
  lateinit var testClass: TestClass

  override fun onCreate(savedInstanceState: Bundle?) {
      AndroidInjection.inject(this)
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
  }
谭安翔
2023-03-14

应用模块。kt:提供应用程序上下文。不需要为测试*类编写@singleton@provides(看看原因)

@Module
class AppModule {
    @Provides
    @Singleton
    fun provideApplication(app: App): Context = app.applicationContext
}

AppComponent。kt:。生成器已弃用IIRC。使用组件。工厂。并用AndroidSupportInjectionModule::class替换AndroidInjectionModule::class,因为我们使用的是dagger android support和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>
}

TestClass。千吨

@Singleton
class TestClass @Inject constructor(private val testOperator: TestOperator) {
    fun getRandomValueFromCTest(): Int = testOperator.generateRandomNumber()
}

@Singleton
class TestOperator @Inject constructor() {
    fun generateRandomNumber(): Int = Random.nextInt()
}

pp.kt:从@Component开始使用工厂而不是构建器。构建器已弃用。

class App : DaggerApplication() {
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.factory().create(this)
    }
}

活动模块。kt:为dagger提供一个模块来创建你的活动。

@Module
interface ActivityModule {

    @ContributesAndroidInjector
    fun provideMainActivity(): MainActivity
}

主要活动。kt:最后,从DaggerAppCompatActivity扩展。

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()
    }
}

我认为这应该没有问题。如需更多参考,您可以查看此示例和新的更简单的docs at dagger。开发/Android

 类似资料:
  • 本文向大家介绍Android 简单实现一个流式布局的示例,包括了Android 简单实现一个流式布局的示例的使用技巧和注意事项,需要的朋友参考一下 本篇文章主要介绍了Android 简单实现一个流式布局的示例,分享给大家,具体如下: 流式布局应该是我们很常见的一种布局了,在很多场景下都会遇到它,例如:标签之类的功能等。用轮子不如造轮子来的爽,这里自己简单的实现下流式布局: onMeasure on

  • 本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本

  • 本文向大家介绍利用PHP实现一个简单的用户登记表示例,包括了利用PHP实现一个简单的用户登记表示例的使用技巧和注意事项,需要的朋友参考一下 一、展示单行的用户信息表 首先我们需要创建两个文件,一个为html文件,一个为php文件。 这里博主就创建了form.html和formHandle.php两个文件。 下面展示一下两个文件的内容: form.html的文件内容: 效果展示: 这里要注意的是:类

  • 本文向大家介绍jQuery实现的简单分页示例,包括了jQuery实现的简单分页示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现的简单分页。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款代码格式化、美化工具,相信大家在以后的开发过程中会用得到: 在线JavaScript代码美化、格式化工具: http://tools.jb51.net/code/js Jav

  • 本文向大家介绍JSP实现的简单分页示例,包括了JSP实现的简单分页示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JSP实现的简单分页示例。分享给大家供大家参考,具体如下: 希望本文所述对大家JSP程序设计有所帮助。

  • 本文向大家介绍jQuery实现一个简单的轮播图,包括了jQuery实现一个简单的轮播图的使用技巧和注意事项,需要的朋友参考一下 html代码: css代码: js代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!