匕首在基类中注入接口
我想在抽象类构造函数中注入接口实现,并在子类中使用它。
我有编译时间错误:
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生成的类可见。
- kodein – 注入的数据值不是数据的值检索
- AndroidInjector <android.app.Activity>不能提供@ Provide或者@ Produces注解的方法
- 使用Guice + Kotlin绑定对象列表
- 建造工程时碰撞匕首
- 如何将IoC注入到Kotlin顶级函数中? 我甚至使用IoC容器?
- 为什么不是Guice找到我的List <Interface>绑定?
- 使用@ Component.Builder和构造函数参数
- Dagger2 – FragmentSubcomponentBuilder没有实现AndroidInjector.Factory
- 如何使用Kotlin定向JavaScript的依赖注入?