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
我正在尝试使用具有以下结构的 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