〈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

参考
LiveData の概要  |  Android デベロッパー  |  Android Developers