Dagger 2 public 字段注入产生 'private field injection' 错误

Dagger 2 public field injection produces 'private field injection' error

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

class ToInject {}
class Injected {
    @Inject
    var toInject: ToInject? = null
}
@Module
object BaseModule {

    var toInject: ToInject? = null

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

        return toInject as ToInject

    }
}

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

Dagger does not support injection into private fields

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

BTW 构造函数注入有效:

class Injected @Inject constructor(var toInject: ToInject){}

尝试显式注释 setter 方法:

class Injected {
    @set:Inject
    var toInject: ToInject? = null
}

class Injected {
    var toInject: ToInject? = null
        @Inject set
}

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

class Injected {
    @JvmField
    @Inject
    var toInject: ToInject? = null
}

问题是 Kotlin 如何翻译成 Java。

这个 Kotlin class:

class Injected {
    var toInject: ToInject? = null
}

居然变成了这个Javaclass:

public final class Injected {
    @Nullable
    private ToInject toInject;

    @Nullable
    public final ToInject getToInject() {
        return this.toInject;
    }

    public final void setToInject(@Nullable ToInject value) {
        this.toInject = value;
    }
}

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

我在注入原始 Int 值时遇到了类似的问题。仅添加 @JvmField 对我有用。感谢@jsamol 指出。

@JvmField
@Inject
@Named(NAMED_APP_LOGO)
var appLogo: Int = 0