見出し画像

[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 と言えるでしょう。

# 参考リンク


この記事が気に入ったらサポートをしてみませんか?