〈kotlin〉LiveDataの変換
Android studioでkotlinを使ってAndroidアプリ作成の勉強中。
あるLiveDataが変更された場合に、
それに応じて別のLiveDataの値も変更したい時に使える Transformations クラスについて。
Transformations.map()
val useId = MutableLiveData<Int>() val userName: LiveData<String> = Transformations.map(userId) { id -> "userName: ${id} " }
この例ではuserIdというLiveDataをTransformations.map()の引数に渡すことで、
userIdに対して関数が適用されて別の値が作成され、
userNameという別のLiveDataには作成された値が入る。
Transformations.switchMap()
private fun getUser(id: String): LiveData<User> { ... } val userId: LiveData<String> = ... val user = Transformations.switchMap(userId) { id -> getUser(id) }
switchMap()を使う場合も同様にuserIdを渡すと関数が適用されるが、
このときに渡す関数は戻り値としてLiveDataを返す必要がある。
複数のLiveDataから変換したいとき
MediatorLiveDataを使用すると複数のLiveDataを監視して、
どちらかの値が変更された場合に値が変更されるLiveDataを作ることができる。
val liveData1 = MutableLiveData<String>("") val liveData2 = MutableLiveData<String>("") val data = MediatorLiveData<String>() init{ data.addSource(LiveData1){ data.value = it data.addSource(LiveData2){ data.value = it } }
こんな感じで、定義したMediatorLiveDataに対して
addSource()を使って監視対象にしたいLiveDataを渡し、
値が変更されたときにしたい処理observerも一緒に渡す。
こちらの記事にあったように関数を作るとわかりやすそう。
DroidKaigi 2020アプリの「combine」が便利という話 - Qiita