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

标签 kotlin dependency-injection dagger-2 dependency-management dagger

关于这个问题已经有几个 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/

相关文章:

android - 保存后个人资料图片不显示(它只显示空白屏幕)

spring-boot - kotlin 中的 spring 应用程序行为怪异

android - 如何为从中心位置到全直径的波纹效果设置动画

android - 使用 Dagger2 注入(inject) OkHttpClient

android - Dagger 无法注入(inject)类型参数字段

android - 在 kotlin 中使用 SimpleXML 序列化 retrofit xml 响应

javascript - 通过依赖注入(inject)传递参数

javascript - Nest 无法解析装饰器内包装的防护的依赖关系

xml - 通过 XML 统一配置字典

java - 使用注释处理延迟绑定(bind)到 Dagger2 Graph