使用LiveData和数据绑定

随着Android体系结构组件的稳定,我开始将所有的基本ViewModel更新为ViewModel的新实现。 在我的理解中,建议使用LiveData来保存Model类,因为它更好地处理生命周期。

我喜欢使用Data Binding因为它使得代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 然而,如果Model (或ViewModel)扩展了BaseObservableLiveData则不扩展, LiveData使用Data Binding的布局只能监视数据的变化。 我明白LiveData的主要目标之一是观察和更新用户界面编程,但对于简单的更新, Data Binding是非常有用的。

这个问题已经被报道( GitHub和堆栈溢出 ),首先是说1.0版本会有,现在说这个function正在开发中。

为了同时使用LiveDataData Binding ,我创建了一个扩展BaseObservable类的非常简单的实现:

 import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.databinding.BaseObservable class ObservableMutableLiveData() : BaseObservable() { private var data: MutableLiveData = 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 { return data } } 

所以基本上我的ObservableMutableLiveData是使用LiveData来存储模型的ObservableField的副本,并且在这个实现中,每次模型更新后布局都会更新。

问题是:

  • 这是一个糟糕的LiveData实现? 这个包装是否“打破”了LiveData的function,比如生命周期感知?
  • 据我了解, LiveData是新的ObservableField 。 它是否正确?

Android Studio 3.1(目前在Canary 6中)将解决这个问题,因为LiveData可以用作observable field

数据绑定更新:

您现在可以在数据绑定expression式中将LiveData对象用作可观察字段。 ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用它来观察LiveData对象。

来源: Android Studio 3.1 Canary 6现在可用