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