MVVM(封装二)

理想很美好,现实很骨感。

实际项目尝试下来。发现,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:

图1
图2

ViewModel : 

图3

如图1,图2,图3,手机号码输入框 与 LoginPhoneVM.phone 属性绑定。 viewModel 仅仅如此。可以说并不是真正的ViewModel。 

Activity:

图4

图4, 典型的 mvp, 通过 presenter 请求接口并回调。

图5

图5,xml 控件的事件绑定。 此时如果需要用到 context 对象。那么,请随便用。

注:viewModel.phone.postValue(""), 清空手机号码输入框。 数据驱动还是有的。只不过与xml相关的才用到。而不是之前所理解的,包括弹窗, toast,页面跳转都用到数据驱动。


后续将整理 RecyclerView 的 binding ,敬请关注,哈哈哈。

你可能感兴趣的:(MVVM(封装二))