理想很美好,现实很骨感。
实际项目尝试下来。发现,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 ,敬请关注,哈哈哈。
网友评论