ViewModel
が持っているLiveData
の値をインスタンスステートとして保持したいとき、androidxのlifecycle-viewmodel-savedstate
ライブラリを使う。fragment 1.2.0
やactivity 1.1.0
を入れているとその依存関係としてsavedstateも入ってくる*1。この記事ではlifecycle-viewmodel-savedstate 2.2.0
での挙動を前提とする。
本当はDIを使ってViewModel
にSavedStateHandle
を注入するところまでが大変なのだが、いろんなブログや本に書いてあるので割愛する。タイトルの通りLiveData
の値を保存したいときはまず、ViewModel
に注入されたSavedStateHandle
からgetLiveData()
を使ってMutableLiveData
を取り出す。
val data: MutableLiveData<Hoge> = savedStateHandle.getLiveData("key_data")
こうすると、SavedStateHandle
内部に定義してあるSavingStateLiveData
というクラスのインスタンスが内部キャッシュから返されるか、そこになければ生成される。このSavingStateLiveData
はsetValue()
の都度、SavedStateHandle.set()
相当の処理をやってくれる。つまり、上で書いたdata
に対しては
data.value = someHogeValue // postValue()も大丈夫なはず
をやるだけでよい。これでいつonSaveInstanceState()
が呼ばれても大丈夫。いうまでもないが、LiveData
以外のプロパティに対しては別途対応が必要になる。