匕首在基类中注入接口
我想在抽象类构造函数中注入接口实现,并在子类中使用它。
我有编译时间错误:
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.
在kotlin中的例子。
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-compiler: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); }
}
从错误信息,我认为这个问题是这一行:
@Inject var data: IData ? = null
该属性的后台字段是private
,这就是错误所说的内容。 通常, lateinit
关键字用于这种情况:
@Inject lateinit var data: IData
lateinit
是几个修饰符中的一个,它直接暴露了属性的访问级别( public
在这里)的后台字段,使其对Dagger生成的类可见。