关于这个问题已经有几个 QA,但对我来说,他们似乎谈论不同的事情(大多数情况下是 Android 的 Kotlin + Dagger2),而不是应用我的具体案例。
我正在通过阅读 this blog post 来学习 Dagger 。我尝试使用 Kotlin,而不是使用该博客中的 Java 代码。
因此,House.kt
作为接口(interface):
interface House {
fun prepareForWar()
fun reportForWar()
}
原样BoltonsDagger.kt
:
class BoltonsDagger @Inject constructor(): House {
override fun reportForWar() {
println("${this.javaClass.simpleName} reporting..")
}
override fun prepareForWar() {
println("${this.javaClass.simpleName} prepared for war")
}
}
原样StarksDagger.kt
:
class StarksDagger @Inject constructor(): House {
override fun prepareForWar() {
println("${this.javaClass.simpleName} prepared for war")
}
override fun reportForWar() {
println("${this.javaClass.simpleName} reporting..")
}
}
最后是带有 main
函数的 WarDagger.kt
:
class WarDagger @Inject constructor() {
@Inject lateinit var starks: StarksDagger
@Inject lateinit var boltons:BoltonsDagger
fun prepare() {
starks.prepareForWar()
boltons.prepareForWar()
}
fun report() {
starks.reportForWar()
boltons.reportForWar()
}
}
fun main() {
val war = WarDagger()
war.prepare()
war.report()
}
出现错误:线程“main”kotlin.UninitializedPropertyAccessException 中出现异常:lateinit 属性 starks 尚未初始化
。
最佳答案
首先,将 WarDagger
更改为以下内容:
class WarDagger @Inject constructor(
private val starks: StarksDagger,
private val boltons: BoltonsDagger
) {
...
}
通过此操作,您可以让 Dagger 了解应如何创建 WarDagger
实例。无需使用 @Inject
注释构造函数字段。
我在问题中找不到 dagger 组件,所以让我们创建一个:
@Component
interface WarComponent {
fun provideWarDagger(): WarDagger
}
我们正在通过该组件创建一个 WarDagger
实例,以便客户端可以获得它的实例。
现在,在 main
内部,您应该从 dagger 组件中检索它,而不是手动创建 WarDagger
实例,因为这就是您使用 DI 的全部原因框架,不是吗?客户端不应该知道如何创建依赖项:
fun main() {
val component = DaggerWarComponent.create()
val war = component.provideWarDagger()
war.prepare()
war.report()
}
关于kotlin - Dagger:lateinit 属性尚未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129309/