gpt4 book ai didi

kotlin - Dagger:lateinit 属性尚未初始化

转载 作者:行者123 更新时间:2023-12-02 13:20:20 25 4
gpt4 key购买 nike

关于这个问题已经有几个 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..")
}
}

最后是 WarDagger.ktmain功能:
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()
}

出现错误: Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property starks has not been initialized .

最佳答案

首先,更改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 里面而不是手动创建 WarDagger 的实例您应该从 dagger 组件中检索它,因为这就是您使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com