lifecycle-livedata-ktx
とは名前のとおりLiveDataのKTX拡張機能のことである。
具体的には、LiveData + Coroutine で組み合わせて非同期で値を取得して返す仕組みである。
導入方法
app/build.gradleに以下を追加するだけ。
dependencies {
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}
公式にも載っている
https://developer.android.com/kotlin/ktx
使い方
ViewModelクラスで、このように書くことができる。
class MainViewModel : ViewModel() {
// 変数宣言と共に、liveData関数内に非同期処理を実装できる
val data: LiveData<String> = liveData {
// 結果を出力
emit("Hello")
}
そしてFragmentから先ほどのdata変数を購読する。
// observeした時に処理が開始される
viewModel.data.observe(viewLifecycleOwner, Observer { data ->
// Helloが表示される
binding.message.text = data
})
observe
した時にliveData関数が呼び出されるので、使用タイミングには気をつけること。
実用的に使うとこんな感じ
ViewModel側
class MainViewModel : ViewModel() {
// lifeData変数にAPI取得を実装できる
val ktxLiveData: LiveData<ScreenState> = liveData {
emit(ScreenState.Loading)
val data = doSomeThing()
emit(ScreenState.Data(data))
}
// API通信やDB取得などの処理
private suspend fun doSomeThing(): SomeData {
delay(3000L)
return SomeData(123)
}
Fragment側でlivedataをobserveするとAPIなどの処理が実行される
class MainFragment : Fragment() {
private fun loadKtxLiveData() {
viewModel.ktxLiveData.observe(viewLifecycleOwner, Observer { state ->
when (state) {
is ScreenState.Loading -> {
Log.d("MainFragment", "Loading表示")
}
is ScreenState.Data -> {
Log.d("MainFragment", "取得成功 Data: ${state.someData}")
binding.message.text = state.someData.id.toString()
Log.d("MainFragment", "Finish")
}
is ScreenState.Error -> {
// Errorハンドリング
Log.d("MainFragment", "Errorダイアログ表示")
}
}
})
}
もしくは、DataBindingにちょくせつViewModelを渡してしまえば、もっとコードを省ける。
使用コード