【问题标题】:When to use Android’s LiveData and Observable field?何时使用 Android 的 LiveData 和 Observable 字段?
【发布时间】:2019-02-22 23:29:44
【问题描述】:

我正在实现一个 MVVM 和数据绑定,我试图了解何时应该在 LiveData 上使用 Observable 字段?

我已经浏览了不同的文档,发现 LiveData 是生命周期感知的,但是在 Github 的示例代码中,这两个同时在 ViewModel 中使用。所以,我很困惑 LiveData 是否优于 Observable 字段,为什么不直接使用 LiveData 呢?

【问题讨论】:

    标签: android mvvm android-databinding android-livedata


    【解决方案1】:

    LiveData可以一直使用,只要有LifecycleOwner可以观察。我更喜欢将仅与ViewModel 相关的绑定字段保留为Observable,并将LiveData 用于状态更改也与ActivityFragment 相关的字段。

    【讨论】:

      【解决方案2】:

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

      • 如果您想为您的 UI 状态模型提供一个生命周期容忍容器,LiveData 就是答案。

      • 如果您想在视图模型中的某个逻辑发生更改时让 UI 自行更新,请使用 ObservableFields

      我自己更喜欢使用 LivaDataObservableField/BaseObservable 的组合,LiveData 通常会充当生命周期感知数据容器,也是 VM 和 View 之间的通道。

      另一方面,通过LiveData 发出的UI 状态模型对象本身就是BaseObservable,或者它们的字段为ObservableField

      这样我就可以使用LiveData 来全面更改 UI 状态。 并在 UI 的一小部分要更新时为 UI 状态模型 ObservableField 字段设置值。

      编辑: 下面是一个关于 UserProfile 组件的快速说明,例如:

      UIStateModel

      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 正常变化。

      XML

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

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

      【讨论】:

      • 您能否再举一个小例子,您更喜欢如何同时使用LiveDataBaseObserver
      • 添加了一个例子。
      • 谢谢!这是一个很好的例子解释。那么,LiveData 就像 Observable 字段一样,可以用于数据绑定和生命周期感知?
      • 是的,您可以直接在 xml 中使用 LiveData 进行数据绑定,如下所示developer.android.com/topic/libraries/data-binding/architecture 我自己更喜欢在代码中观察 ViewModel 中的 LiveData 并将其值用作数据绑定模型,选择适合您的最好的:)
      【解决方案3】:

      LiveData - 与 LifecycleOwner 类似的活动或片段一起使用

      Observable - 与数据绑定一起使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多