Dagger在基类中注入接口

时间:2016-07-10 16:56:47

标签: dependency-injection kotlin dagger

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

我有编译时错误:

Any

kotlin中的例子。

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.

版本:

  • 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

   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()
    }
}

}

1 个答案:

答案 0 :(得分:7)

从错误消息中,我认为问题在于这一行:

@Inject var data: IData ? = null

此属性的支持字段为private,这就是错误所说的内容。通常lateinit关键字用于此类情况:

@Inject lateinit var data: IData

lateinit是几个修饰符之一,它直接使用属性的访问级别(此处为public)公开支持字段,使其对Dagger生成的类可见。