fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

SavedStateHandleを使ってLiveDataの値を保存する

ViewModelが持っているLiveDataの値をインスタンスステートとして保持したいとき、androidxのlifecycle-viewmodel-savedstateライブラリを使う。fragment 1.2.0activity 1.1.0を入れているとその依存関係としてsavedstateも入ってくる*1。この記事ではlifecycle-viewmodel-savedstate 2.2.0での挙動を前提とする。

本当はDIを使ってViewModelSavedStateHandleを注入するところまでが大変なのだが、いろんなブログや本に書いてあるので割愛する。タイトルの通りLiveDataの値を保存したいときはまず、ViewModelに注入されたSavedStateHandleからgetLiveData()を使ってMutableLiveDataを取り出す。

val data: MutableLiveData<Hoge> = savedStateHandle.getLiveData("key_data")

こうすると、SavedStateHandle内部に定義してあるSavingStateLiveDataというクラスのインスタンスが内部キャッシュから返されるか、そこになければ生成される。このSavingStateLiveDatasetValue()の都度、SavedStateHandle.set()相当の処理をやってくれる。つまり、上で書いたdataに対しては

data.value = someHogeValue  // postValue()も大丈夫なはず

をやるだけでよい。これでいつonSaveInstanceState()が呼ばれても大丈夫。いうまでもないが、LiveData以外のプロパティに対しては別途対応が必要になる。