以下の内容は古い。
現在は lifecycle-livedata-ktx の observe 拡張関数を使うべき。
Activity や Fragment で ViewModel の中の LiveData を監視したいとき、例えばこのようになるでしょう。
myViewModel.myLiveData.observe(this, Observer<String?> {
if (it != null) {
myTextView.text = it
}
})
it は String? 型です。では、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
})
it は String 型です。