何时使用Android的LiveData和Observable字段?

uurity8g  于 2022-11-27  发布在  Android
关注(0)|答案(4)|浏览(169)

我正在实现MVVM和数据绑定,我试图了解何时应该在LiveData上使用Observable field?
我已经浏览了不同的文档,发现LiveData是生命周期感知的,但是在Github的示例代码中,这两者同时在ViewModel中使用。所以,我很困惑,如果LiveData比Observable字段更好,为什么不直接使用LiveData呢?

qnzebej0

qnzebej01#

两者都有各自的用例,例如:

  • 如果您希望UI状态模型具有生命周期相容容器,LiveData就是答案。
  • 如果您想让UI在视图模型中的一部分逻辑发生更改时进行自我更新,则使用ObservableFields

我自己更喜欢使用LivaDataObservableField/BaseObservable的组合,LiveData通常作为生命周期感知数据容器,也是虚拟机和视图之间的通道。
另一方面,通过LiveData发出的UI状态模型对象本身是BaseObservable,或者其字段是ObservableField
这样,我就可以使用LiveData来完成UI状态的全部更改,并在需要更新一小部分UI时为UI状态模型ObservableField字段设置值。

  • Edit*:以下是UserProfile组件的快速说明,例如:
    用户界面状态模型
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 
}

检视

您将看到配置文件LiveData正常更改。

可扩展标记语言

您将使用数据绑定来绑定UI状态模型。

编辑:现在成熟的我更喜欢Immutability,而不是答案中解释的可变属性。

4ioopgfo

4ioopgfo2#

只要存在LifecycleOwner,就可以一直使用LiveData,我更喜欢将只与ViewModel相关的绑定字段保留为Observable,而将状态变化也与ActivityFragment相关的字段使用LiveData

csga3l58

csga3l583#

LiveData -与LifecycleOwner一起使用,如活动或片段
可观察-与数据绑定一起使用

z3yyvxxp

z3yyvxxp4#

@Ahmed Ashraf的回答是误导性的,如果我们只讨论数据绑定,数据绑定本身是生命周期感知的,因为我们在使用数据绑定时设置了lifecycleOwner,它已经检查了视图何时是活动的。

binding.lifecycleOwner = viewLifecycleOwner

因此,不必使用实时数据来保存BaseObservable对象,我们可以直接在视图模型内部使用BaeObervable对象。
回到这个问题,在单向数据绑定中,可以使用LiveDataObservableFields,甚至Stateflow,但在双向数据绑定中,我仍然更喜欢ObservableFields,因为它更灵活,您可以轻松地在可观察字段setter中编写自定义逻辑,并且当UI发生变化时,它可以调用setter来做一些额外的事情。

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

和xml文件中。

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@={viewmodel.rememberMe}"
/>

相关问题