43
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Kotlin の拡張関数で LiveData の observe をいい感じにする

Last updated at Posted at 2018-01-12

以下の内容は古い。
現在は lifecycle-livedata-ktxobserve 拡張関数を使うべき。

Activity や Fragment で ViewModel の中の LiveData を監視したいとき、例えばこのようになるでしょう。

myViewModel.myLiveData.observe(this, Observer<String?> {
    if (it != null) {
        myTextView.text = it
    }
})

itString? 型です。では、Observer<String?>Observer<String> にするとどうでしょうか

myViewModel.myLiveData.observe(this, Observer<String> {
    if (it != null) {
        myTextView.text = it
    }
})

it は変わらず String? 型です。これは Observer インターフェイスが以下のようになっているためです。

// Java だよ
public interface Observer<T> {
    void onChanged(@Nullable T t);
}

Kotlin からどんな型 T が渡されるかにかかわらず、メソッドの引数は @Nullable です。

しかし、null には絶対にならない、あるいは、 null は無視していいという場合も多いでしょう。そこで、以下のような拡張関数を作っておきます。

fun <T> LiveData<T>.observeNonNull(owner: LifecycleOwner, observer: (T) -> Unit) {
    this.observe(owner, Observer {
        if (it != null) {
            observer(it)
        }
    })
}

そうすると、このように書くことができます。

myViewModel.myLiveData.observeNonNull(this, {
    myTextView.text = it
})

itString 型です。

43
20
1

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
43
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?