MVVM 完全に理解した - 11.5
DataBindingとViewModelについてまたもやクソ勘違いしてたので安らかな死( ˘ω˘)スヤァ
— KC@MVVMでアプリ再考 (@kcpoipoi) December 22, 2018
ということで(?)、安らかな死因を述べます。
ViewModel + DataBinding + LiveData の重要なメソッド
その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 がいなかったから通知先が見つからなかったんですかね……。
言い訳
調べた順番がまずかったですかねぇ…。
- LiveData
- ViewModel (not with DataBinding)
- DataBinding (not with ViewModel)
- ViewModel + DataBinding + LiveData (第7回記事)
の流れの中で、setLifecycleOwner
メソッドを見落としていたようです。
今はちょっとしたアプリの作成に追われている(1月2日締切)ので、終わったら通常通り更新していきたいと思います。