我正在开发一个库,其中参数的任何更改都会刷新视图。在refresh()函数中,我将一些参数的值设置为默认值。
var viewAlpha= 255
set(value) {
field = value
refresh()
}
fun refresh() {
viewAlpha = 255
invalidate()
}
Run Code Online (Sandbox Code Playgroud)
由于明显的原因,这会导致 StackOverflowError。
引起:java.lang.StackOverflowError: stack size 8MB
当我们在同一个类中访问它时,是否可以在不调用其 setter 的情况下访问 kotlin 中的变量。类似于我们在java中所做的。
一种方法是为您提供良好的支持字段以摆脱 setter-refres 循环:
private var _viewAlpha = 255
var viewAlpha
get() {
return _viewAlpha
}
set(value) {
_viewAlpha = value
refresh()
}
fun refresh() {
_viewAlpha = 255
invalidate()
}
Run Code Online (Sandbox Code Playgroud)
如果您想简化多个字段的逻辑,您可以将此实现抽象为单独的类,并使用带有直接 setter 的回调调用,无需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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |