如果您知道Google的实验性Android体系结构组件,则可能知道MutableLiveData。尝试使它变得更有趣:

class KotlinLiveData<T>(val default: T) {
    val data = MutableLiveData<T>()

    operator fun getValue(thisRef: Any?, property: KProperty<*>):T {
        return data.value ?: default
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value:T) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            data.value = value
        } else {
            data.postValue(value)
        }
    }
}

然后我可以:
var name : String by KotlinLiveData("not given")
name = "Chrzęszczybrzęczykiewicz"

但是可惜-这使得data变得不可访问,即无法注册Observer:
name.data.observe(this, nameObserver) // won't work :(

我能以某种方式知道吗?

最佳答案

您可以access the delegate object属性,并从中获取MutableLiveData<T>:

inline fun <reified R> KProperty<*>.delegateAs<R>(): R? {
    isAccessible = true
    return getDelegate() as? R
}

然后的用法是:
::name.delegateAs<KotlinLiveData<String>>?.data?.observe(this, nameObserver)

要引用成员属性,请使用this::namesomeInstance::name

此解决方案要求您将Kotlin反射API kotlin-reflect 添加为项目的依赖项。另外,由于类型擦除,.delegateAs<KotlinLiveData<String>>调用也不是类型安全的:它只能检查委托(delegate)是否为KotlinLiveData<*>,而不能检查其类型参数为String

09-25 22:58