在Kotlin中,我如何定义var具有惰性默认值的?
例如,a val会是这样的:
val toolbarColor by lazy {color(R.color.colorPrimary)}
Run Code Online (Sandbox Code Playgroud)
我想要做的是,有一些属性(toolbarColor)的默认值,我可以改变其他任何值.可能吗?
编辑:这是部分技巧.
var toolbarColor = R.color.colorPrimary
get() = color(field)
set(value){
field = value
}
Run Code Online (Sandbox Code Playgroud)
是否可以通过写作来缓解这种情况
var toolbarColor = color(R.color.colorPrimary)
set(value){
field = value
}
Run Code Online (Sandbox Code Playgroud)
以某种方式懒惰地计算默认值?目前它不起作用,因为color()需要的Context只是稍后初始化.
Dei*_*zan 11
您可以创建自己的委托方法:
private class ColorDelegate<T>(initializer: () -> T) : ReadWriteProperty<Any?, T> {
private var initializer: (() -> T)? = initializer
private var value: T? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return value ?: initializer!!()
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
this.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
在一些代表中声明:
object DelegatesExt {
fun <T> lazyColor(initializer: () -> T): ReadWriteProperty<Any?, T> = ColorDelegate(initializer)
}
Run Code Online (Sandbox Code Playgroud)
并使用如下:
var toolbarColor by DelegatesExt.lazyColor {
// you can have access to your current context here.
// return the default color to be used
resources.getColor(R.color.your_color)
}
...
override fun onCreate(savedInstanceState: Bundle?) {
// some fun code
// toolbarColor at this point will be R.color.your_color
// but you can set it a new value
toolbarColor = resources.getColor(R.color.new_color)
// now toolbarColor has the new value that you provide.
}
Run Code Online (Sandbox Code Playgroud)
我认为这可能是一种更清洁的方式,但我还不知道(几天前从kotlin开始).我将看看是否可以用更少的代码完成.
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |