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以外のプロパティに対しては別途対応が必要になる。