はじめに
LiveData Builderを勉強したのでメモ代わりに投稿します。
LiveData Builderとは?
androidx.lifecycle:lifecycle-livedata-ktx
に含まれる拡張機能で、liveData
関数内でsuspend関数を呼び出し、LiveDataに値を直接反映させることができます。
Android Developers内に解説があります。
また、こちらに公式のコードラボがあります。
リポジトリ
GitHubからリポジトリ情報を取得してリスト表示するサンプルをこちらに上げてあります。
導入
LiveData Builderの導入にはlivedata-ktxの導入が必要です。
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-rc03"
LiveData Builderを使わない場合
通常、LiveDataを扱う場合は MutableLiveData
を用いて以下のように記述すると思います。
// MutableLiveDataで取得したいオブジェクトをラップ
val data = MutableLiveData<Repos>()
// 関数を定義
fun getRepos() {
viewModelScope.launch {
try {
// APIからデータ取得 ※getReposはsuspend関数
val repos = api.getRepos()
// postValueでdata内の値を更新
data.postValue(repos)
}
catch (e: Exception) {
...
}
}
}
// viewModelを定義
private val viewModel: ViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
...
// 関数呼び出し
viewModel.getRepos()
// dataの値を監視
viewModel.data.observe(this, Observer {
// 値が更新された時の処理
})
}
LiveData Builderを使った場合
LiveData Builderを使うと以下のように記述することが出来ます。
// LiveData Builder
val data: LiveData<Repos> = liveData {
try {
val repos = api.getRepos() // getReposはsuspend関数
emit(repos) // emit()で値を更新する
}
catch (e: Exception) {
...
}
}
// fun getRepos()は削除
// viewModelを定義
private val viewModel: ViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
...
// dataの値を監視
viewModel.data.observe(this, Observer {
// 値が更新された時の処理
})
}
ViewModel内の記述がかなりスッキリしたことが分かります。
liveData { ... }
はいつ呼ばれるのか?という疑問があると思いますが、
Viewが値をobserve
した時になります。
LiveData Builderを使うことによって、
- コード量が削減できる
- MutableLiveDataをImmutableなLiveDataに置き換えることができる
- functionをActivity・Fragmentから呼び出さずに済む
などのメリットがあります。
Viewのロード時に一度だけAPIを叩くような場合は、MutableLiveData
を使わずにLiveData
で十分になるかと思います。
おわりに
まだLiveData Builderを触り慣れてないので、他にもこんなメリットがあるよ!などのご意見お待ちしております。
今回の記事を書くにあたって、以下のリンクを参考にさせて頂きました。