todo-mvvm-databinding源码分析

MVVM框架 todo-mvvm-databinding 项目例子。

MVP框架 todo-mvp 项目例子。

目的

分析和学习官方mvvm框架的设计模式和数据绑定在其中的具体用法,制作一套符合当前公司业务场景的mvvm框架。其中也分析一下数据源在项目中的设计以及框架中单元测试的实施。

设计模式

MVVM框架中的ViewModel相比MVP框架中的Presenter起着类似的作用。两种框架结构的不同之处在于View分别与ViewModelPresenter进行通信:

  • 当MVVM框架中数据发生变化时会影响ViewModel的改变,View会自动更新库或框架。你不能直接通过ViewModel来修改View
  • 在这个项目中,你可以使用布局文件将ViewModel中的变量绑定到特定的UI元素上(如TextViewImageView)。数据绑定可以确保View和ViewModel保持双向同步,如下图所示。

项目结构

项目相对比较简单,有以下几个模块

  • tasks 任务首页模块
  • taskdetail 任务详情模块
  • addedittask 添加任务模块
  • statistics 静态计数模块
  • data 数据模块
  • util 工具包

源码分析

在这里不将每个模块具体剖析,用taskdetail作为代表模块分析mvvm框架的设计。

在TaskDetailActivity中获取Fragment和ViewModel对象

来看TaskActivityonCreate()方法, 通过findOrCreateViewFragment()findOrCreateViewModel()来获取Fragment和ViewModel对象。

Fragment中的数据绑定

TaskDetailFagment中的onCreateView()方法做了数据绑定,用setViewmodel()ViewModel类和XML布局绑定到一起。

我们再来看一下布局数据绑定片段

ViewModel 实现

先来看一下子类TaskDetailViewModel实现,该类继承了TaskViewModel并提供了deleteTaskstartEditTask两个对外方法供Fragment调用。这里的设计和MVP结构的P层是类似的,对外提供业务方法,内部实现具体业务。mTaskDetailNavigator接口是在TaskDetailActivity做具体实现的。

再来看父类TaskViewModel的实现。代码比较多,主要包含三个部分。

  • 属性变量定义,为了实现双向绑定所以new的是ObservableField对象
  • 数据相关方法,例如setTask()getCompleted()等这些
  • 通用业务操作方法,基本的封装

总结

相对分析来看,这个项目代码比较简单没有什么难度,也有点失望。本来想看看官方项目有没有什么比较好的对ViewModel封装的方法,结果每个Activity都复制了一遍findOrCreateViewFragment()findOrCreateViewModel()这两个方法,在Fragment中对数据绑定也没有做进一步的封装处理,心累...果然是基础框架教程,框架封装的事还是自己来搞吧。

附上官方github地址

参考链接


发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注