android - Kotlin 惰性默认属性

标签 android kotlin

在 Kotlin 中,如何定义具有惰性默认值的 var

例如,一个 val 会是这样的:

val toolbarColor  by lazy {color(R.color.colorPrimary)}

我想要做的是,为某些属性(toolbarColor)设置一个默认值,然后我可以为其他任何内容更改该值。可能吗?

编辑:这是部分技巧。

var toolbarColor = R.color.colorPrimary
    get() = color(field)
    set(value){
        field = value
    }

是否可以通过编写来缓解这种情况

var toolbarColor = color(R.color.colorPrimary)
    set(value){
        field = value
    }

以延迟计算默认值的方式?目前它不起作用,因为 color() 需要一个稍后才初始化的 Context

最佳答案

您可以创建自己的委托(delegate)方法:

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
    }
}

在某个委托(delegate)中声明:

object DelegatesExt {
    fun <T> lazyColor(initializer: () -> T): ReadWriteProperty<Any?, T> = ColorDelegate(initializer)
}

并按如下方式使用:

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.
}

我认为这可能是一种更清洁的方式,但我还不知道(从几天前的 kotlin 开始)。我会看看这是否可以用更少的代码来完成。

关于android - Kotlin 惰性默认属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346966/

相关文章:

android - 如何将我的应用程序设置为 Espresso 测试中的默认应用程序?

android - Xamarin.Forms Android 沉浸式模式,带软键盘或警报

functional-programming - 使用arrow-kt的列表理解时的ClassCastException

android - Firebase 实例 ID : binding to the service failed: Kotlin

java - 列表中的 EditText 未按应有的方式工作

android - Drawable 的 mutate 方法 Android 1.6 中的 NullPointerException

java - JUnit 5 测试工厂迭代器

java - Android KeyStore 加密和解密数据

android - 当导航到可组合时,我们如何隐藏 BottomAppBar(包含导航)?

java - 调用需要 API 级别 11(当前最小值为 8)android.app.Activity#onCreateView