Android 匕首注射对“不起作用”;“对象”;在科特林

Android 匕首注射对“不起作用”;“对象”;在科特林,android,kotlin,singleton,dagger,Android,Kotlin,Singleton,Dagger,在花了相当长的时间试图找出我的匕首注射不起作用的原因之后;我意识到Kotlin中的“对象”类型是问题所在 以下操作不起作用,注入的“属性”为空 object SomeSingleton { @Inject lateinit var property: Property init { DaggerGraphController.inject(this) } } 但是,以下方法确实很有效: class NotSingleton { @I

在花了相当长的时间试图找出我的匕首注射不起作用的原因之后;我意识到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单例不能注入成员,而常规非单例类可以?

如果查看kotlin字节码,您会发现您编写的代码被转换为以下内容:

public final class SomeSingleton {
    public static LProperty; property // <- Notice static field here

    public final getProperty()LProperty
    ...

    public final setProperty(LProperty)V
    ...
}

我试着使用dagger.Lazy,效果很好

 @set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>
@set:Inject
lateinit var authClient:dagger.Lazy

您可能仍然需要对象定义顶部的
@Singleton
装饰器。decorator并没有使您的类成为“singleton”,它只是被Dagger用来在同一点上获取所有依赖项。

解决方法是扩展一个由要注入的字段组成的基类

objectsomesingleton:BaseClass{
...
...
}
开放类基类{
@注入
lateinit变量属性:属性
初始化{
你的匕首成分。注射(这个)
}
}
这确实有效,尽管这会泄漏
This
,这是android studio的一个警告,为了消除这一点,基类会变得抽象,而不是在原始对象类中注入字段

objectsomesingleton:BaseClass{
...
... 
//在此处添加init块,而不是基类
初始化{
你的匕首成分。注射(这个)
}
}
抽象类基类{
@注入
lateinit变量属性:属性
//从这里删除init块
}
您可以像Dagger AppComponent接口一样,使用def中的任何一个函数

接口组件{
乐趣注入(someSingleton:someSingleton)
//或
趣味注入(基类:基类)
}

我希望这会有帮助……

这仍然不起作用,我第一次遇到未初始化的字段错误……之后,我甚至尝试了@field:Inject的NoClassDefFoundError,同样的负面结果不幸对我不起作用。编译过程中出现异常
,原因是:com.google.common.base.premissions.checkArgumentException位于dagger.internal.codegen.writing.InjectionMethod.invoke(InjectionMethod.java:112)位于dagger.internal.codegen.writing.InjectionMethods$injectionItemMethod.invoke(InjectionMethods.java:358)
你找到解决方案了吗?听起来像是
对象。init
DaggerGraphController
东西的初始化运行得更快。@Caferertceyhan,你说不工作是什么意思?会发生什么情况?我只是在尝试注入kotlin对象时遇到这个错误:
Dagger不支持注入kotlin对象ects
。这在Dagger 2.27上。对我不起作用,异常返回:lateinit属性[variable]尚未初始化
 @set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>