首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger: lateinit属性尚未初始化

Dagger: lateinit属性尚未初始化
EN

Stack Overflow用户
提问于 2019-09-27 14:54:37
回答 1查看 2.5K关注 0票数 2

在这个问题上已经有几个问答,但对我来说,他们似乎谈到了不同的事情(大多数情况下是安卓的Kotlin + Dagger2 ),并不适用于我的具体情况。

我正在通过阅读this blog post来学习“短剑”。我尝试使用Kotlin,而不是使用该博客中的Java代码。

因此,House.kt as接口:

代码语言:javascript
复制
interface House {
    fun prepareForWar()
    fun reportForWar()
}

原样BoltonsDagger.kt

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-27 16:23:43

首先,将WarDagger更改为:

代码语言:javascript
复制
class WarDagger @Inject constructor(
    private val starks: StarksDagger,
    private val boltons: BoltonsDagger
) {
    ...
}

这样,您就可以让Dagger知道应该如何创建WarDagger实例。不需要用@Inject注释构造函数字段。

我在问题中找不到dagger组件,所以让我们创建一个:

代码语言:javascript
复制
@Component
interface WarComponent {
    fun provideWarDagger(): WarDagger
}

我们正在通过组件访问WarDagger的一个实例,这样客户端就可以获得它的一个实例。

现在,在main中,您应该从dagger组件中检索它,而不是手动创建WarDagger的实例,因为这就是您使用DI框架的全部原因,不是吗?客户端不应该知道依赖关系是如何创建的:

代码语言:javascript
复制
fun main() {
    val component = DaggerWarComponent.create()
    val war = component.provideWarDagger()
    war.prepare()
    war.report()
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58129309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档