阅读 158

MVVMSmart系列文章--Jetpack的ViewMoel的封装

2017的Google I/O大会,Google推出了ViewMoel,viewmode的生命周期不受Fragment各个生命周期影响(onDestroy除外,因为会封装把viewmodel置空),viewmode是MVVM实现中极其重要的组件,我觉得类似于Fragment之于Android一样重要.我希望本篇文章即使您已经对viewmode驾轻就熟,我仍希望让你学到viewmode的更多东西.

9点到下班,到家10点了,本来想玩两把lol,但下午一个兄弟说我的MVVMSmart很棒,等着看我下一篇博客,心中很感动,给了我鼓励和动力.孩子媳妇儿已经睡了,但我依然有写一篇博客的动力,多谢泽涛哥们儿鼓励.

博文代码在MVVMSmart项目中

  • MVVMsmart地址:github.com/wzqjava/MVV…
  • 分支名称:MVVMSmart-kotlin(切换分支,readme会自动切换成对应语言)
  • 分支名称:MVVMSmart-java(切换分支,readme会自动切换成对应语言)
  • 基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合ViewModel+Lifecycles+Navigation+DataBinding+LilveData+Okhttp+Retrofit+RxJava+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发高质量、易维护的Android应用.

Navigation出来后,目前google希望轻Activity多Fragment,也就是说一个大的功能是一个Activit,内部其他所有二三级页面都用navigation导航Fragmeng,那面如果你整个程序中有50个Fargmengt, 一个Fragment对应一个ViewModle,这样可以,但你我都有经验,一定不会这么写,如何在任何Fragment中,只提供一个类名,父类自动创建Viewmodel,使用时却是当前Fragment对应的viewmodel, viewmodel在父类中创建,整个App通用;

  1. 当前Fragment继承父类,泛型1向上传递当前布局的Binding,泛型2向上传递当前类的ViewModel

  1. 父类泛型 V extends ViewDataBinding,VM extends BaseViewModel

  1. 当前页的binding如何实例化呢,看图 父类的onCreateView中统一创建binding

  1. ViewModel如何初始化呢, 看图,父类的onViewCreated中调用initViewDataBinding,创建ViewMode并绑定LifecycleOwner, 关联生命周期,

  1. initViewDataBinding,是本篇文章的核心了,您需要去我的MVVMSmart中仔细看,才能深刻理解,因为ViewModel有两种创建方式,带Factory的和不带Factror的,需要封装,initViewDataBinding方法中的initViewModel()方法专门让子类重写带Factroy的.不重写的话父类帮着创建(带Factory的相对用的不多哈),看图,红色框中,进行了创建,

  1. 部分同学肯定有疑惑,每个ViewModel中有各种LiveData,和方法,子类直接使用父类的泛型,编译的时候或开发代码的时候能拿到 具体的Viewmode中的变量和业务吗????? 答:当然可以,这就是泛型向上传递的好处,我在我真实项目中向上传递了3次,其中一层向上传递中断了,造成当前ViewModel开发和编译的时候拿不到具体viewmode中的变量和方法,查了4个小时,问了好几个人,到要崩溃了,后来希瑞同学帮我看到了传递中断的问题,表示感谢. 最后上两个图,在回顾下上边的内容;
  • 父类中的泛型

  • 子类中直接使用

写博客稍麻烦,写了40分钟.

  • 看博客看懂思路即可, 书上得来终觉浅,绝知此事要躬行. 要想清楚如何使用和更高级用法,请下载代码自己查看,才能做到掌握,多谢Star. 代码地址:github.com/wzqjava/MVV…