我正在使用一个库,其中参数的任何更改都会刷新视图。在refresh()
函数中,我将一些参数的值设置为默认值。
var viewAlpha= 255
set(value) {
field = value
refresh()
}
fun refresh() {
viewAlpha = 255
invalidate()
}
由于明显的原因,这导致StackOverflowError。
原因:java.lang.StackOverflowError:堆栈大小8MB
当我们在同一个类中访问它时,是否可以在不调用其setter的情况下访问kotlin中的变量。类似于我们在Java中所做的事情。
答案 0 :(得分:4)
一种方法是为您提供良好的支持,以摆脱二传手的循环:
private var _viewAlpha = 255
var viewAlpha
get() {
return _viewAlpha
}
set(value) {
_viewAlpha = value
refresh()
}
fun refresh() {
_viewAlpha = 255
invalidate()
}
如果您想简化多个字段的逻辑,则可以将此实现抽象为单独的类,并使用具有直接设置方法的回调调用,该调用方法无需refresh
调用即可工作。像这样:
class Field(val onSetCb: (Field) -> Unit) {
private var viewAlpha = 255
fun get() {
return viewAlpha
}
fun set(value: Int) {
setDirect(value)
onSetCb(this)
}
fun setDirect(value: Int) {
viewAlpha = value;
}
}
// Elsewhere...
fun refresh(field: Field) {
field.setDirect(255)
invalidate()
}
val f = Field(::refresh)
f.set(255)