8
5

More than 3 years have passed since last update.

LiveData Builderを使ってコードをスッキリさせる

Last updated at Posted at 2020-01-20

はじめに

LiveData Builderを勉強したのでメモ代わりに投稿します。

LiveData Builderとは?

androidx.lifecycle:lifecycle-livedata-ktxに含まれる拡張機能で、liveData 関数内でsuspend関数を呼び出し、LiveDataに値を直接反映させることができます。

Android Developers内に解説があります。

また、こちらに公式のコードラボがあります。

リポジトリ

GitHubからリポジトリ情報を取得してリスト表示するサンプルをこちらに上げてあります。

導入

LiveData Builderの導入にはlivedata-ktxの導入が必要です。

build.gradle
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-rc03"

LiveData Builderを使わない場合

通常、LiveDataを扱う場合は MutableLiveData を用いて以下のように記述すると思います。

ViewModel
    // 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) {
                ...
            }
        }
    }
MainActivity
    // viewModelを定義
    private val viewModel: ViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        // 関数呼び出し
        viewModel.getRepos()

        // dataの値を監視
        viewModel.data.observe(this, Observer {
            // 値が更新された時の処理
        })
    }

LiveData Builderを使った場合

LiveData Builderを使うと以下のように記述することが出来ます。

ViewModel
    // LiveData Builder
    val data: LiveData<Repos> = liveData {
        try {
            val repos = api.getRepos()  // getReposはsuspend関数
            emit(repos) // emit()で値を更新する
        }
        catch (e: Exception) {
            ...
        }
    }
    // fun getRepos()は削除
MainActivity
    // 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を触り慣れてないので、他にもこんなメリットがあるよ!などのご意見お待ちしております。

今回の記事を書くにあたって、以下のリンクを参考にさせて頂きました。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5