Dependency injection Dagger将接口注入私有字段
我想在抽象类构造函数中注入接口实现,并在子类中使用它 我有编译时错误:Dependency injection Dagger将接口注入私有字段,dependency-injection,kotlin,dagger,Dependency Injection,Kotlin,Dagger,我想在抽象类构造函数中注入接口实现,并在子类中使用它 我有编译时错误: Error:Gradle: Dagger does not support injection into private fields Error:Gradle: Example.A cannot be provided without an @Provides-annotated method. Error:Gradle: Example.B cannot be provided without an @Inject co
Error:Gradle: Dagger does not support injection into private fields
Error:Gradle: Example.A cannot be provided without an @Provides-annotated method.
Error:Gradle: Example.B cannot be provided without an @Inject constructor or from an @Provides-annotated method.
Error:Gradle: Execution failed for task ':app:compileDemoDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
科特林的例子
object Example {
interface IData {
fun foo() {
}
}
class Data : IData {
}
@Module
class DataModel {
@Provides
fun data(): IData = Data()
}
@Singleton
@Component(modules =
arrayOf(DataModel::class)
)
interface Injector {
fun inject(a: A)
fun inject(b: B)
}
val graph: Injector = DaggerInjector.builder().
dataModel(DataModel()).
build()
abstract class A {
@Inject var data: IData ? = null
public open fun setUp() {
graph.inject(this)
}
}
open class B : A() {
override fun setUp() {
super.setUp()
data!!.foo()
}
}
fun bar() {
val a = B()
a.setUp()
}
}
版本:
- com.android.tools.build:gradle:2.1.2
- ext.kotlin_version='1.0.3'
- 编译'com.google.dagger:dagger:2.4'
- 提供了“org.glassfish:javax.annotation:10.0-b28”
- kapt'com.google.dagger:dagger编译器:2.4'
这是一个例子。反编译java
public static class A {
@Inject
@Nullable
private Example.IData data;
@Nullable
protected final Example.IData getData() {
return this.data;
}
protected final void setData(@Nullable Example.IData <set-?>) {
this.data = <set-?>;
}
public void setUp() {
Example.INSTANCE.getGraph().inject(this);
}
公共静态A类{
@注入
@可空
私有示例.IData数据;
@可空
受保护的final Example.IData getData(){
返回此.data;
}
受保护的最终void setData(@Nullable Example.IData){
这个数据=;
}
公共作废设置(){
Example.INSTANCE.getGraph().inject(this);
}
}从错误消息中,我认为问题出在这一行:
@Inject var data: IData ? = null
此属性的支持字段为private
,这是错误显示的内容。通常在以下情况下使用lateinit
关键字:
@Inject lateinit var data: IData
lateinit
是几个直接使用属性访问级别(public
此处)公开支持字段的修饰符之一,使其对Dagger生成的类可见。谢谢。我不明白发生了什么事。数据是受保护的,并且可以重复。@StasShakirov在应用lateinit
后,您附加的代码段将从中反编译,对吗?如果对lateinit
之前的代码执行相同的操作,则应该看到这一行,而不是private Example.IData data代码>。由于dagger不使用setter来填充@Inject
字段,而是尝试直接访问字段,因此它在原始情况下抛出错误。此可见性更改是lateinit
的副作用(除了它在Kotlin中的主要含义之外),因为此修饰符最初是为依赖项注入支持而创建的。我回答您的评论时有点晚:)希望它现在有意义。哈,有趣!我从来不知道lateinit
公开了backing字段。我会将@Inject
移动到属性的setter。