MVVMとデータバインディングを実装していますが、LiveDataでObservableフィールドをいつ使用するべきかを理解しようとしていますか?
私はすでにさまざまなドキュメントを実行していて、LiveDataがライフサイクルに対応していることを発見しましたが、Githubのサンプルコードでは、これら2つがViewModelで同時に使用されています。それで、LiveDataがObservableフィールドより優れていると混乱しているのですが、LiveDataをまったく使用しないのはなぜですか?
どちらにも、たとえば次のようなユースケースがあります。
UI状態モデルのライフサイクルトレラントコンテナーが必要な場合は、LiveData
が答えです。
ロジックの一部がビューモデルで変更されたときにUI自体を更新する場合は、ObservableFields
を使用します。
私自身はLivaData
とObservableField/BaseObservable
の組み合わせを使用することを好みます。LiveData
は通常、ライフサイクル対応のデータコンテナとして動作し、VMとビュー。
一方、LiveData
を介して出力されるUI状態モデルオブジェクトは、それ自体がBaseObservable
であるか、フィールドがObservableField
として存在します。
そうすれば、UI状態の完全な変更にLiveData
を使用できます。また、UIの小さな部分を更新する場合は常に、UI状態モデルのObservableField
フィールドに値を設定します。
Edit:次に、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)
}
}
ViewModel
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状態モデルをバインドします。
Edit:成熟した私は変更可能なプロパティを持つ代わりに Immutability を好むようになりました答えで説明したように。
LiveData-アクティビティやフラグメントのようなLifecycleOwnerでの使用
観察可能-データバインディングで使用
監視するLiveData
がある限り、いつでもLifecycleOwner
を使用できます。 ViewModel
にのみ関連するバインドされたフィールドをObservable
として保持し、状態変化がLiveData
にも関連するフィールドにActivity
を使用することを好みますFragment
。