Kotlin - 即使存在init()函数,也必须初始化属性或抽象属性

时间:2017-11-06 14:31:44

标签: android initialization kotlin

我已使用Android Studio 3.0将此代码从Java转换为Kotlin

internal var background: Drawable
internal var xMark: Drawable

private fun init() {
    background = ColorDrawable(Color.RED)
    xMark = ContextCompat.getDrawable(this@Subscriptions_main, R.drawable.delete)
}

在第1行和第2行我收到错误:

  

属性必须初始化或是抽象的

即使它将在init函数中初始化。

写作:

internal var background: Drawable? = null
internal var xMark: Drawable? = null

一种可行且有效的解决方案?还有其他更好的方法吗?

3 个答案:

答案 0 :(得分:10)

在使用lateinit之前,您必须了解这意味着什么。

您的变量未正确初始化。解决这个问题的各种方法:

  • 初始化构造函数内部的变量或正确的init块(不是您声明的私有函数)
  • 在声明变量的同时初始化变量
  • 稍后初始化变量,让Kotlin知道(这是lateinit关键字)

这3个选项并不相同,根据您的代码,前两个可能比第三个更合适。

如果您在变量实际初始化之前访问变量,

lateinit会使您的应用崩溃。

答案 1 :(得分:4)

init blocks不是函数,只需删除private fun部分和括号:

internal var background: Drawable
internal var xMark: Drawable

init {
    background = ColorDrawable(Color.RED)
    xMark = ContextCompat.getDrawable(this@Subscriptions_main, R.drawable.delete)
}

答案 2 :(得分:0)

您需要lateinit关键字。检查the docs