花了很多时间试图弄清楚为什么我的匕首注射不起作用;我意识到"对象"输入Kotlin就是问题所在。
以下不起作用,注入"属性"是空的。
FormulaEvaluator.evaluateFormulaCell()
但是,以下DID工作正常:
object SomeSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
我试过谷歌,我尝试了文档,但我无法指出这背后的原因。另请注意,我没有尝试使用JAVA,JAVA并没有内置单例的概念。
为什么会这样?为什么kotlin单身人士无法注入成员但是常规的非单身人士类可以?
答案 0 :(得分:10)
如果您查看kotlin字节码,您会发现您编写的代码已翻译成以下内容:
public final class SomeSingleton {
public static LProperty; property // <- Notice static field here
public final getProperty()LProperty
...
public final setProperty(LProperty)V
...
}
正如您所看到的,实际字段是静态的,这使得它无法用于实例注入。您可以尝试将@Inject
注释移动到setter方法:
object SomeSingleton {
@set:Inject
lateinit var property: Property
...
}
答案 1 :(得分:5)
我尝试使用dagger.Lazy<YourClass>
,它有效
@set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>
答案 2 :(得分:1)
一种解决方法是扩展由要注入的字段组成的BaseClass。
object SomeSingleton : BaseClass {
...
...
}
open class BaseClass{
@Inject
lateinit var property: Property
init{
YourDaggerComponent.inject(this)
}
}
这确实有效,尽管这会泄漏this
(这是一个android studio警告),以消除这种情况,使Base类成为抽象类,而是将字段插入原始对象类中
object SomeSingleton : BaseClass {
...
...
// Add the init block here instead of the base class
init{
YourDaggerComponent.inject(this)
}
}
abstract class BaseClass{
@Inject
lateinit var property: Property
//Remove the init block from here
}
与Dagger AppComponent界面类似,任何这些功能def都应该起作用
interface Component{
fun inject(someSingleton : SomeSingleton)
//OR
fun inject(baseClass: BaseClass)
}
我希望这会有所帮助。...
答案 3 :(得分:0)
您可能仍需要在对象定义之上使用@Singleton
装饰器。该装饰器不会使您的类变得“单一”,Dagger只是使用它来将所有依赖项放在同一位置。