以下の内容は古い。
現在は 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
型です。