Dagger 2 公共字段注入产生“私有字段注入”错误

Sir*_*lot 1 kotlin dagger-2

我正在尝试使用Dagger2以下结构设置一个非常基本的字段注入:

class ToInject {}
Run Code Online (Sandbox Code Playgroud)
class Injected {
    @Inject
    var toInject: ToInject? = null
}
Run Code Online (Sandbox Code Playgroud)
@Module
object BaseModule {

    var toInject: ToInject? = null

    @Provides
    @JvmStatic
    fun toInjectProvider(): ToInject {
        if (toInject == null) {
            toInject = ToInject()
        }

        return toInject as ToInject

    }
}
Run Code Online (Sandbox Code Playgroud)

我试图注入的字段肯定是PUBLIC但编译器返回以下错误

Dagger 不支持注入私有字段

任何人都可以解释为什么我会收到此错误以及如何解决它?

BTW 构造函数注入工作:

class Injected @Inject constructor(var toInject: ToInject){}
Run Code Online (Sandbox Code Playgroud)

jsa*_*mol 5

尝试显式注释 setter 方法:

class Injected {
    @set:Inject
    var toInject: ToInject? = null
}
Run Code Online (Sandbox Code Playgroud)

或者

class Injected {
    var toInject: ToInject? = null
        @Inject set
}
Run Code Online (Sandbox Code Playgroud)

您还可以将您的字段注释为@JvmField

class Injected {
    @JvmField
    @Inject
    var toInject: ToInject? = null
}
Run Code Online (Sandbox Code Playgroud)

问题是如何将 Kotlin 翻译成 Java。

这个 Kotlin 类:

class Injected {
    var toInject: ToInject? = null
}
Run Code Online (Sandbox Code Playgroud)

实际上变成了这个Java类:

class Injected {
    @set:Inject
    var toInject: ToInject? = null
}
Run Code Online (Sandbox Code Playgroud)

因此,尽管您在 Kotlin 中将字段设置为公开,但实际上它只是一个带有公共 setter 和 getter 的私有字段。