我正在尝试在非 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 框架相关的组件,因此在您的情况下是 MainActivity
TestGreetings
类不是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/