kotlin - kotlin 中的字段注入(inject)始终为空

标签 kotlin dagger-2

我正在尝试在非 Activity 类中进行字段注入(inject),但我总是得到该字段尚未初始化/为空。我已阅读 Can I use Dagger 2's field injection in Kotlin? , 还有 Dagger 2 on Android @Singleton annotated class not being injected ,仍然有同样的问题。这是我的设置方式
这是模型类

class Greetings {
    val sayHello: String = "Hello from Dagger 2" 
}
这是模块类
@Module
class GreetingsModule {
    @Provides
    @Singleton
    fun providesGreetings(): Greetings {
        return Greetings()
    }
}
这是组件
@Singleton
@Component(modules = arrayOf(GreetingsModule::class))
interface GreetingsComponent {
    fun inject(mainActivity: MainActivity)
    fun inject(testGreetings: TestGreetings)
}
以及从 Application 扩展的类
class App: Application() {
    private lateinit var greetingsComponent: GreetingsComponent
    override fun onCreate() {
        super.onCreate()
        greetingsComponent = DaggerGreetingsComponent.builder().build()
    }
    fun getGreetings() = greetingsComponent
}
这就是我将它注入(inject)另一个类的方式以及在哪里为空/未初始化
class TestGreetings {
    @Inject
    lateinit var greetings: Greetings
    fun checkIfNull() {
        if  (greetings != null) {
            Log.d("INFO", "${ greetings.sayHello}")
        } else {
            Log.d("INFO", "null !!!!!!")

        }
    }
}
我到底做错了什么?

最佳答案

好的,我会尝试回答
您不能使用 Greetings 的字段注入(inject)在 TestGreetings类,因为 Dagger 不知道如何注入(inject)它。
字段注入(inject)通常用于与 Android 框架相关的组件,因此在您的情况下是 MainActivityTestGreetings类不是Android框架类,所以最好使用构造函数注入(inject),像这样

class TestGreetings(private val greetings: Greetings) {

    fun checkIfNull() {
        if  (greetings != null) {
            Log.d("INFO", "${ greetings.sayHello}")
        } else {
            Log.d("INFO", "null !!!!!!")

        }
    }
}
为了让 Dagger 知道如何初始化 TestGreetings类,需要在GreetingsModule中定义类(class)
@Module
class GreetingsModule {
    ...
    @Provides
    @Singleton
    fun providesTestGreetings(greetings: Greetings): TestGreetings {
        return TestGreetings(greetings)
    }
}
现在您可以使用 TestGreetings类(class) MainActivity
class MainActivity: AppCompatActivity() {
   @Inject
   lateinit var testGreetings: TestGreetings
   
   override fun onCreate(savedInstanceState: Bundle?) {
       ...
       testGreetings.checkIfNull()
   }
}
最后,您可以删除 fun inject(testGreetings: TestGreetings)GreetingsComponent附:确保您的 Dagger 设置在 MainActivity是正确的
希望这能把事情弄清楚:)

关于kotlin - kotlin 中的字段注入(inject)始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62872292/

相关文章:

android - Dagger2 中 @Binds 与 @Provides 注释的用例是什么

android - 如何将protobuf添加到flutter/kotlin android项目中

android - 如何使用 Retrofit 和 Kotlin 协程下载 PDF 文件?

android - Dagger 2 : Component depends on more than one scoped component

android - Recylerview MVVM 中未显示 JSON 数据

android - 在Android的Application类中为DI创建所有模块

java - 将依赖项注入(inject) Dagger2 中的后台服务

android - Kotlin 合成扩展和几个包含相同的布局

kotlin 命令行编译器

java - 使用 String name() 声明实现 Java 接口(interface)的 Kotlin 枚举