当前位置:  开发笔记 > 编程语言 > 正文

Kotlin懒惰的默认属性

如何解决《Kotlin懒惰的默认属性》经验,为你挑选了1个好方法。

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

例如,a 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只是稍后初始化.



1> Deividi Cava..:

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

private class ColorDelegate(initializer: () -> T) : ReadWriteProperty {

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

在一些代表中声明:

object DelegatesExt {
    fun  lazyColor(initializer: () -> T): ReadWriteProperty = 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开始).我将看看是否可以用更少的代码完成.


也许它应该在stdlib?
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有