日々是好日

プログラミングについてのあれこれ、ムダ知識など

MVVM 完全に理解した - 11.5

ということで(?)、安らかな死因を述べます。

ViewModel + DataBinding + LiveData の重要なメソッド

kcpoipoi.hatenablog.com

その7において、レイアウトファイルに ViewModel をバインドさせた上で次のような処理をMainActivity#onCreateに記述しています。

viewmodel.inputText.observe(this, Observer { input ->
        if (input != null) {
            //UI更新
            binding.output.text = input
        }
    })

結論から言えば、上記の処理は完全な間違いです
なんでバインディングView を触る必要がなくなったはずなのに、binding.outputで View 触ってるの????

当初はバインドさせたのに値が反映されなかったので、「なんか動いた!」的なテンションで上記コードを書いていました。誠にごめんなさい。

必要な記述は、上記コードを消したうえでbinding.setLifecycleOwnerのコール。

binding.setLifecycleOwner(this) //Fragment自身

これを呼ぶことで値が正常に更新されるようになります。

たぶん Binding オブジェクトに Owner がいなかったから通知先が見つからなかったんですかね……。

言い訳

調べた順番がまずかったですかねぇ…。

  1. LiveData
  2. ViewModel (not with DataBinding)
  3. DataBinding (not with ViewModel)
  4. ViewModel + DataBinding + LiveData (第7回記事)

の流れの中で、setLifecycleOwnerメソッドを見落としていたようです。

今はちょっとしたアプリの作成に追われている(1月2日締切)ので、終わったら通常通り更新していきたいと思います。