理想很美好,現實很骨感。
實際項目嘗試下來。發現,MVVM 真的很難用。為什么?
?或許太過在乎數據驅動。彈出對話框,toast,頁面跳轉,都需要數據去驅動。
或許沒能搞懂 Android 的 context 與 ViewModel 的關系。 對于不持有 context 對象的 ViewModel來說。碰到需要引用context時,快速開發已和我無關。
然而,嘗試過 mvvm 的雙向綁定之后,省去 findViewById,省去各種 setter 等等酸爽點后,何不將 mvvm中的 databinding 單獨應用起來呢。
原有項目是基于 mvp 的,
那么怎么與 databinding 結合?
各單位職責又是怎么樣的?
Activity: 持有 Binding, ViewModel, Presenter
ViewModel:不再一大坨,只簡單持有?BaseObservable , LiveData 數據對象。主要職責是將 數據對象 與 xml 做雙向綁定。其中包括 text,?visibility, enable?等基本屬性。
Presenter: 保持不變,主要網絡請求與接口回調等一些業務邏輯。
由于 Activity 持有 Binding 對象,故控件的事件等一些動作都在 Activity 里實現。彈窗,toast,頁面跳轉等自然也在Activity 里。?
相比 mvp,多了 binding。
相比 mvvm,ViewModel 簡化,將部分職責分給 Presenter,Activity。
貼下項目里的部分登錄代碼。
XML:
ViewModel :?
如圖1,圖2,圖3,手機號碼輸入框 與 LoginPhoneVM.phone 屬性綁定。 viewModel 僅僅如此。可以說并不是真正的ViewModel。?
Activity:
圖4, 典型的 mvp, 通過 presenter 請求接口并回調。
圖5,xml 控件的事件綁定。 此時如果需要用到 context 對象。那么,請隨便用。
注:viewModel.phone.postValue(""), 清空手機號碼輸入框。 數據驅動還是有的。只不過與xml相關的才用到。而不是之前所理解的,包括彈窗, toast,頁面跳轉都用到數據驅動。
后續將整理 RecyclerView 的 binding ,敬請關注,哈哈哈。