Kotlin init 块没有执行
Kotlin init block didn't execute
我创建了一个扩展 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
是空的。 init
块在 constructor
之后没有执行,有什么问题吗?谢谢
问题是您覆盖了 range
的 setter 而没有将其支持字段设置为新值。这应该可以解决它:
var range: Range
set(value) {
field = value
max = value.toSeekbarMaximum()
}
创建 属性 并在 init 块中初始化 属性 就像您拥有它的方式与在声明时初始化 属性 相同。 init 块仅在调用主构造函数时执行。您有默认的主构造函数(空构造函数)和自定义的辅助构造函数。如果您希望它在 init 块中执行,则必须调用主构造函数。如果你希望范围每次都在构造时初始化,只需在声明时初始化它并摆脱 init 块。
var range: Range = Range(0, 100, 1)
set(value){
max = value.toSeekbarMaximum()
field = value
}
我创建了一个扩展 android.widget.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
是空的。 init
块在 constructor
之后没有执行,有什么问题吗?谢谢
问题是您覆盖了 range
的 setter 而没有将其支持字段设置为新值。这应该可以解决它:
var range: Range
set(value) {
field = value
max = value.toSeekbarMaximum()
}
创建 属性 并在 init 块中初始化 属性 就像您拥有它的方式与在声明时初始化 属性 相同。 init 块仅在调用主构造函数时执行。您有默认的主构造函数(空构造函数)和自定义的辅助构造函数。如果您希望它在 init 块中执行,则必须调用主构造函数。如果你希望范围每次都在构造时初始化,只需在声明时初始化它并摆脱 init 块。
var range: Range = Range(0, 100, 1)
set(value){
max = value.toSeekbarMaximum()
field = value
}