前提・実現したいこと
MVVM (DataBinding) + Repository パターンの構成です。
fragment, viewModel, layoutXml の3ファイルがあります。
通常は ViewModel内で Repository を操作し LiveData に値を設定し、
LayoutXMLでは DataBinding で LiveData の値を表示しています。
しかしながら、View(fragment)側で、ViewTreeObserver.OnGlobalLayoutListener 等で画面の描画をトリガーに画面幅などを計算し、
計算結果の数値を LayoutXML に渡して描画に使用したい処理が出てきました。
発生している問題
ViewModel に MutableLiveData を public または internal で持たせ、
fragment 側は計算結果を ViewModel の上記 MutableLiveData に setValue し、
LayoutXML では ViewModel の上記 MutableLiveData を参照すれば DataBinding でその計算結果を利用できました。
ただ、これでは MVVM の責務に反しているように思っているのです。
ViewModel は MutableLiveData を private にすべきだと思われます。
でも ViewModel で View の参照を持つべきではないという原則もあり、 画面幅の計算等は framgnet の責務であり ViewModel で行うべきではないと思っています。
かといって、fragment 自体に LiveData を持たせてそれを databinding で渡そうとしても
Int と LiveData<Int> は Type mismatchで渡すことができません。
このような場合はどうやって View 側で変更した値を DataBinding で渡すのが正しいのでしょうか?
回答1件
あなたの回答
tips
プレビュー