匕首注射不适用于"对象"在Kotlin

时间:2018-01-24 02:08:34

标签: android kotlin singleton dagger

花了很多时间试图弄清楚为什么我的匕首注射不起作用;我意识到"对象"输入Kotlin就是问题所在。

以下不起作用,注入"属性"是空的。

FormulaEvaluator.evaluateFormulaCell()

但是,以下DID工作正常:

object SomeSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}

我试过谷歌,我尝试了文档,但我无法指出这背后的原因。另请注意,我没有尝试使用JAVA,JAVA并没有内置单例的概念。

为什么会这样?为什么kotlin单身人士无法注入成员但是常规的非单身人士类可以?

4 个答案:

答案 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只是使用它来将所有依赖项放在同一位置。