在花了大量可笑的时间试图弄清楚为什么我的匕首注射不起作用之后;我意识到Kotlin中的“对象”类型是问题所在。
以下内容不起作用,注入的“属性”为空。
object SomeSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
但是,以下代码确实工作得很好:
class NotSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
我试过谷歌,我试过文档,但我不能指出背后的原因。还要注意的是,我还没有用JAVA试过,JAVA无论如何都没有内置单例的概念。
为什么会这样?为什么Kotlin单例不能注入成员,而常规的非单例类可以?
5条答案
按热度按时间7fhtutme1#
如果你仔细研究Kotlin字节码,你会发现你写的代码被翻译成了如下的形式:
正如你所看到的,实际的字段是静态的,这使得它不适合示例注入。你可以尝试将
@Inject
注解移到setter方法上,方法是:6rqinv9w2#
解决方法是扩展由要注入的字段组成的BaseClass。
这确实有效,尽管这会泄漏
this
,这会作为androidstudio警告出现,以消除将基类抽象化的问题,并将字段注入原始对象类你的Dagger AppComponent接口可以是这样的,任何一个函数def都可以工作
希望这能有所帮助。
k3fezbri3#
我尝试使用
dagger.Lazy<YourClass>
,它工作正常5f0d552i4#
你可能仍然需要
@Singleton
装饰器在你的对象定义之上,这个装饰器并不使你的类成为“单例”,它只是被Dagger用来在同一个地方获得所有的依赖项。chhqkbe15#
这是Dagger中的一个bug所允许的,正如其他人所描述的,这是因为Kotlin对象中的属性由静态字段支持。
有关修复,请参见https://github.com/google/dagger/issues/1665。该问题已在2.27中修复。