MutableLiveDataとLiveDataの使い方
・個人開発でMVVMへアーキテクチャを変更した際にLivedataとMutableLiveDataを使用したのでLivedataとMutableLiveDataについて書きたいと思います。
・基本的にMutableLiveDataはviewModel内で使用し、viewModel以外で使用する(オブザーブ)する際にはLiveDataを使用する。不本意にUIレイヤーで変更されることを防ぐことを目的としている。
//viewModel内
val sampleLiveData= MutableLiveData("Sample data")
・上記だとsamepleLiveDataがviewModel以外の場所で不要に呼ばれた際に値が変更されてしまう可能性がある。
//viewModel内
private val _sampleLiveData = MutableLiveData("Sample data")
val sampleLiveData: LiveData<String> get() = _sampleLiveData
・この場合だとデータを変更するためには_samepleLivedataを呼び出す必要があるがプライベート変数になっているのでviewModel以外では呼び出すことができない。viewModel以外でこのデータをUIレイヤー呼び出すには参照用のsampleLiveDataを使用する必要がある。しかしsampleLiveDataはLiveDataなのでmutableであるため値を変更することができない。それゆえ意図しないデータの変更を防ぐことができる。
*慣用的にパブリックAPIとして機能するLivedataプロパティは任意の命名をし、外部に公開しないMutableLiveDataプロパティにはプレフィックスとしてアンダースコア(_)をつける。
mutableLiveDataデータ変更時 setValue, postValue, mutableLiveData.value の違い
・setValueは メインスレッドでしか使用できない。
・それ以外のスレッドではpostValueを使う。
・基本的にはfirebaseやroom側でi/oスレッドの処理は行なってくれるので、ほとんどの場合は メインスレッドだけを使えばいいのでmutableLiveData.valueが望ましい。
LivedataとstateFlowの違い
・StateFlowは初期状態でコンストラクタを渡す必要があるが、Livedataでは渡す必要がない。
・Livedata.observeではビューがstopped状態になるとコンシューマが自動的に登録解除されるが、stateFlowでは自動収集されない。