gpt4 book ai didi

android - 声明为不可为空的 Kotlin 属性即使具有初始化值也可以为空

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

这是一个非常有趣的情况。
我有一些android自定义 View 。它具有一些属性“状态”,用于根据此属性更改复选框的可绘制状态。如您所见,该属性被声明为不可为空,并且我使用默认值“State.Regular”对其进行了初始化。

class SomeCustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatCheckBox(context, attrs) {

sealed class State {
object Regular : State()
object Specific : State()
}

// todo: it will be nice to implement statesaving
// but it's okay for now
var state: State = State.Regular
set(value) {
field = value
refreshDrawableState()
}

override fun onCreateDrawableState(extraSpace: Int): IntArray =
super.onCreateDrawableState(extraSpace + 1).apply {
val stateAttrRes = when(state) {
State.Specific -> R.attr.some_custom_view_specific
State.Regular -> R.attr.some_custom_view_regular
}

View.mergeDrawableStates(this, intArrayOf(stateAttrRes))
}
}

但是当我们要使用这个 View 时,它会因为这个异常而崩溃:
kotlin.NoWhenBranchMatchedException

我曾尝试调试 when 表达式,我注意到在“onCreateDrawableState”方法中,它没有使用默认值“State.Regular”进行初始化,而是使用“null”进行初始化,这就是我们有这个“NoWhenBranchMatchedException”的原因。

你有什么想法为什么这个属性初始化为 null 以及如何解决这个问题?

最佳答案

问题是 AppCompatCheckBox的构造函数(调用 onCreateDrawableState )在 SomeCustomView 之前调用的初始化属性。如果您不需要自定义 setter ,您可以使用 lateinit并在 onCreateDrawableState 内初始化;有了它,考虑these workarounds (但对于这个地方来说,它们可能太复杂了)。

关于android - 声明为不可为空的 Kotlin 属性即使具有初始化值也可以为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60577264/

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