[Android] SavedStateHandle を簡単に使えるライブラリ ViewModel-SavedState-ktx をリリースしました
# ViewModel-SavedState-ktx とは
ViewModel-SavedState の SavedStateHandle を隠蔽して Delegated Property で簡単に扱えるようにするライブラリです。
## ViewModel-SavedState とは
ViewModel はプロセス Kill 時に破棄されるため、Activity が再生成された場合に状態が残りません。そのため、状態を保持したい場合は onSavedInstanceState で状態を保存する必要があります。 Activity から状態を分離したのにプロセス Kill 対応のため onSavedInstanceState を使わなければならない状況です。
ViewModel-SavedState は SavedStateHandle を使うことで onSavedInstanceState を使わずに ViewModel で状態管理しやすくするための Jetpack ライブラリです。
現在の最新バージョンは 1.0.0-alpha05 です。
https://developer.android.com/jetpack/androidx/releases/lifecycle#viewmodel-savedstate-1.0.0-alpha05
## SavedStateHandle とは
SavedStateHandle は Bundle に入れることができる値を保持でき、 HashMap のように扱えます。また、変更が自動的に保存される LiveData を取得できます。
class SampleViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
companion object {
private const val KEY_TEXT = "text"
}
var text: String?
get() = savedStateHandle.get(KEY_TEXT)
set(value) {
savedStateHandle.set(KEY_TEXT, value)
}
val textLiveData: LiveData<String> = savedStateHandle.getLiveData(KEY_TEXT)
}
# ViewModel-SavedState-ktx は何が嬉しいのか
Kotlin の Delegated Property で以下のように書くことができます。
class SampleViewModel(
savedStateHandle: SavedStateHandle
) : SavedStateViewModel(savedStateHandle) {
companion object {
private const val KEY_TEXT = "text"
}
var text: String by savedStateProperty(KEY_TEXT)
val textLiveData: LiveData<String> by savedStateLiveData(KEY_TEXT)
}
大きな変更点は SavedStateHandle です。SavedStateHandle はコンストラクタに存在するのみで、利用時には全く意識する必要がありません。
細かい変更点は以下の4点です。
1. SavedStateViewModel を継承する
2. SavedStateViewModel のコンストラクタに SavedStateHandle を渡す
3. 状態を保持したいプロパティを by savedStateProperty で宣言する
4. LiveData で欲しい場合は by savedStateLiveData で宣言する
以上で SavedStateHandle へのアクセスを完全に抽象化することができます。状態を保存するということを意識せずに行うことができます。
# ViewModel-SavedState-ktx を使う
build.gradle に以下を追加してください。
repositories {
maven { url "https://www.jitpack.io" }
}
dependencies {
implementation 'com.github.wada811:ViewModel-SavedState-ktx:1.0.0-alpha05'
}
バージョンは 1.0.0-alpha05 ですが、ViewModel-SavedState のバージョンに合わせているだけなので ViewModel-SavedState が Production Ready だと思うなら ViewModel-SavedState-ktx も Production Ready と言えるでしょう。