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 型です。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.