Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Dagger:lateinit属性尚未初始化_Kotlin_Dependency Injection_Dagger 2_Dependency Management_Dagger - Fatal编程技术网

Kotlin Dagger:lateinit属性尚未初始化

Kotlin Dagger:lateinit属性尚未初始化,kotlin,dependency-injection,dagger-2,dependency-management,dagger,Kotlin,Dependency Injection,Dagger 2,Dependency Management,Dagger,在这个问题上已经有几个QA了,但对我来说,他们似乎在谈论不同的事情(大多数情况下是Android的Kotlin+Dagger2),而不是应用我的具体案例 我在通过阅读学习匕首。我尝试使用Kotlin,而不是使用该博客中的Java代码 因此,House.kt作为接口: interface House { fun prepareForWar() fun reportForWar() } 原样博尔顿匕首.kt: class BoltonsDagger @Inject construc

在这个问题上已经有几个QA了,但对我来说,他们似乎在谈论不同的事情(大多数情况下是Android的Kotlin+Dagger2),而不是应用我的具体案例

我在通过阅读学习匕首。我尝试使用Kotlin,而不是使用该博客中的Java代码

因此,
House.kt
作为接口:

interface House {
    fun prepareForWar()
    fun reportForWar()
}
原样
博尔顿匕首.kt

class BoltonsDagger @Inject constructor(): House {
    override fun reportForWar() {
        println("${this.javaClass.simpleName} reporting..")
    }

    override fun prepareForWar() {
        println("${this.javaClass.simpleName} prepared for war")
    }
}
class StarksDagger @Inject constructor(): House {
    override fun prepareForWar() {
        println("${this.javaClass.simpleName} prepared for war")
    }

    override fun reportForWar() {
        println("${this.javaClass.simpleName} reporting..")
    }
}
原样
StarksDagger.kt

class BoltonsDagger @Inject constructor(): House {
    override fun reportForWar() {
        println("${this.javaClass.simpleName} reporting..")
    }

    override fun prepareForWar() {
        println("${this.javaClass.simpleName} prepared for war")
    }
}
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尚未初始化

class WarDagger @Inject constructor(
    private val starks: StarksDagger,
    private val boltons: BoltonsDagger
) {
    ...
}
这样,您就可以让Dagger知道如何创建
WarDagger
的实例。无需使用
@Inject
注释构造函数字段

我无法在问题中找到匕首组件,所以让我们创建一个:

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

你在什么地方表演过DI吗?另外,请检查此链接: