匕首在基类中注入接口

我想在抽象类构造函数中注入接口实现,并在子类中使用它。

我有编译时间错误:

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生成的类可见。