data class ProfileUIModel(
private val _name: String,
private val _age: Int
): BaseObservable() {
var name: String
@Bindable get() = _name
set(value) {
_name = value
notifyPropertyChanged(BR.name)
}
var age: Int
@Bindable get() = _age
set(value) {
_age = value
notifyPropertyChanged(BR.age)
}
}
视图模型
class UserProfileViewModel: ViewModel() {
val profileLiveData: MutableLiveData = MutableLiveData()
...
// When you need to rebind the whole profile UI object.
profileLiveData.setValue(profileUIModel)
...
// When you need to update a specific part of the UI.
// This will trigger the notifyPropertyChanged method on the bindable field "age" and hence notify the UI elements that are observing it to update.
profileLiveData.getValue().age = 20
}
class LoginViewModel : BaseObservable {
// val data = ...
@Bindable
fun getRememberMe(): Boolean {
return data.rememberMe
}
fun setRememberMe(value: Boolean) {
// Avoids infinite loops.
if (data.rememberMe != value) {
data.rememberMe = value
// React to the change.
saveData()
// Notify observers of a new value.
notifyPropertyChanged(BR.remember_me)
}
}
}
4条答案
按热度按时间qnzebej01#
两者都有各自的用例,例如:
LiveData
就是答案。ObservableFields
。我自己更喜欢使用
LivaData
和ObservableField/BaseObservable
的组合,LiveData
通常作为生命周期感知数据容器,也是虚拟机和视图之间的通道。另一方面,通过
LiveData
发出的UI状态模型对象本身是BaseObservable
,或者其字段是ObservableField
。这样,我就可以使用
LiveData
来完成UI状态的全部更改,并在需要更新一小部分UI时为UI状态模型ObservableField
字段设置值。用户界面状态模型
视图模型
检视
您将看到配置文件LiveData正常更改。
可扩展标记语言
您将使用数据绑定来绑定UI状态模型。
编辑:现在成熟的我更喜欢Immutability,而不是答案中解释的可变属性。
4ioopgfo2#
只要存在
LifecycleOwner
,就可以一直使用LiveData
,我更喜欢将只与ViewModel
相关的绑定字段保留为Observable
,而将状态变化也与Activity
或Fragment
相关的字段使用LiveData
。csga3l583#
LiveData -与LifecycleOwner一起使用,如活动或片段
可观察-与数据绑定一起使用
z3yyvxxp4#
@Ahmed Ashraf的回答是误导性的,如果我们只讨论数据绑定,数据绑定本身是生命周期感知的,因为我们在使用数据绑定时设置了
lifecycleOwner
,它已经检查了视图何时是活动的。因此,不必使用实时数据来保存BaseObservable对象,我们可以直接在视图模型内部使用BaeObervable对象。
回到这个问题,在单向数据绑定中,可以使用
LiveData
或ObservableFields
,甚至Stateflow
,但在双向数据绑定中,我仍然更喜欢ObservableFields
,因为它更灵活,您可以轻松地在可观察字段setter中编写自定义逻辑,并且当UI发生变化时,它可以调用setter来做一些额外的事情。和xml文件中。