匕首喷射对Kotlin中的“对象”无效

vmdwslir  于 2023-02-09  发布在  Kotlin
关注(0)|答案(5)|浏览(148)

在花了大量可笑的时间试图弄清楚为什么我的匕首注射不起作用之后;我意识到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单例不能注入成员,而常规的非单例类可以?

7fhtutme

7fhtutme1#

如果你仔细研究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
    ...
}
6rqinv9w

6rqinv9w2#

解决方法是扩展由要注入的字段组成的BaseClass。

object SomeSingleton : BaseClass {
    ...
    ...
}

open class BaseClass{
    @Inject
    lateinit var property: Property

    init{
        YourDaggerComponent.inject(this)
    }

}

这确实有效,尽管这会泄漏this,这会作为androidstudio警告出现,以消除将基类抽象化的问题,并将字段注入原始对象类

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)
}

希望这能有所帮助。

k3fezbri

k3fezbri3#

我尝试使用dagger.Lazy<YourClass>,它工作正常

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

5f0d552i4#

你可能仍然需要@Singleton装饰器在你的对象定义之上,这个装饰器并不使你的类成为“单例”,它只是被Dagger用来在同一个地方获得所有的依赖项。

chhqkbe1

chhqkbe15#

这是Dagger中的一个bug所允许的,正如其他人所描述的,这是因为Kotlin对象中的属性由静态字段支持。
有关修复,请参见https://github.com/google/dagger/issues/1665。该问题已在2.27中修复。

相关问题