gpt4 book ai didi

android - Kotlin init block 没有执行

转载 作者:行者123 更新时间:2023-11-29 14:43:14 26 4
gpt4 key购买 nike

我创建了一个扩展 android.widget.Seekbar 的自定义 SeekBar:

data class Range(val min: Int, val max: Int, private val defaultIncrement: Int) {
val increment = if ((max - min) < defaultIncrement) 1 else defaultIncrement
}

internal fun Range.toSeekbarMaximum(): Int = (max - min) / increment

class RangeSeekBar: SeekBar {

constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

init {
range = Range(0, 100, 1)
}

var range: Range
set(value) {
max = value.toSeekbarMaximum()
}

override fun setProgress(progress: Int) = super.setProgress((progress - range.min) / range.increment)

override fun getProgress(): Int = range.min + super.getProgress() * range.increment
}

运行代码时出现NPE,先执行constructor,然后执行setProgress,由于range为null而崩溃。 init block 没有在 constructor 之后执行,有什么问题吗?谢谢

最佳答案

创建属性并在 init block 中初始化该属性,就像您拥有它的方式一样,与在声明时初始化属性相同。 init block 仅在调用主构造函数时执行。您有默认的主构造函数(空构造函数)和自定义的辅助构造函数。如果您希望它在 init block 中执行,则必须调用主构造函数。如果您希望范围每次都在构造时初始化,只需在声明时初始化它并摆脱 init block 。

var range: Range = Range(0, 100, 1)
set(value){
max = value.toSeekbarMaximum()
field = value
}

关于android - Kotlin init block 没有执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52341997/

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