【发布时间】:2018-05-23 10:59:44
【问题描述】:
随着 Android 架构组件的稳定,我开始将所有基本的ViewModels 更新为ViewModel 的新实现。据我了解,建议使用LiveData 来保存Model 类,因为它可以更好地处理生命周期。
我喜欢使用Data Binding,因为它使 Java/Kotlin 端的代码更清晰,并且不需要“观察”值更改来更新 UI。然而,使用Data Binding 的布局仅在Model(或ViewModel)扩展BaseObservable 和LiveData 不扩展时才观察数据变化。我了解LiveData 的主要目标之一是观察并以编程方式更新 UI,但对于简单的更新,Data Binding 非常有用。
这个问题已经被报告了(GitHub 和Stack Overflow),最初说 1.0 版会有这个问题,现在说这个功能正在开发中。
为了同时使用LiveData 和Data Binding,我创建了一个扩展BaseObservable 的类的非常简单的实现:
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable
class ObservableMutableLiveData<T>() : BaseObservable() {
private var data: MutableLiveData<T> = MutableLiveData()
constructor(data: T) : this() {
this.data.value = data
}
public fun set(value: T) {
if (value != data.value) {
data.value = value
notifyChange()
}
}
public fun get(): T? {
return data.value
}
public fun getObservable(): LiveData<T> {
return data
}
}
所以基本上我的ObservableMutableLiveData 是ObservableField 的副本,使用LiveData 来存储模型,并且通过此实现,每次模型更新后布局都会更新。
问题是:
- 这是
LiveData的错误实现吗?这个包装器是否“破坏”了LiveData的功能,例如生命周期感知? - 据我了解,
LiveData是新的ObservableField。这是正确的吗?
【问题讨论】:
-
对实时数据使用数据绑定的正确方法现在在数据绑定的文档中:Use LiveData to notify the UI about data changes。
标签: android kotlin android-databinding android-architecture-components android-mvvm