前情提要
主页面的跳转函数
Fragment
ShowcaseFragment 继承 BaseEpoxyFragment,
BaseEpoxyFragment 继承 BaseMvRxFragment
BaseMvRxFragment
是 com.airbnb.android:mvrx:1.3.0
第三方库中的,链接:
在看另外两个Fragment
(PreviewFragment和LottiefilesFragment)
都是BaseMvRxFragment的子类,自然就需要了解一下mvrx这个库了
MvRx库
全称:ModelView ReactiveX,
是Airbnb开源的一个库,运用了Kotlin、Android Architecture Components、RxJava、React和Epoxy技术,利用这个库可以方便地构建出MVVM架构的APP。
核心概念
MvRx 有四个核心的概念,分别是 State、ViewModel、View 和 Async。
State
MvRxState用来储存页面所需要的数据,是不可变对象(immutable object),单纯存储数据;State的改变会触发View的invalidate()方法,从而通知界面重绘。
ViewModel
是Architecture Components中ViewModel的扩展;
用来处理所有的业务逻辑,ViewModel搭配一个State,可以在ViewModel中更新、读取State,然后View可以观察State的状态,根据状态进行更新
实现类继承MvRxViewModel
PS:需要有一个工厂方法,主要用途是通过依赖注入传入一些参数来构造ViewModel
View
一般而言是一个继承自BaseMvRxFragment的Fragment,需要实现invalidate()方法,每当ViewModel的state发生改变时invalidate()方法都会被调用
Async
专门处理异步请求(加载状态)的类
是一个Kotlin sealed class,它有四种类型:Uninitialized, Loading, Success, Fail(包含了一个名为 error 的属性,可以获取错误类型)
更新state的两种方法
execute
setState
View中使用ViewModel
MvRx提供3了个获取ViewModel的扩展方法:
fragmentViewModel 创建或者获取现有的ViewModel,有效范围为Fragment
activityViewModel 创建或者获取现有的ViewModel,有效范围为Activity,通常用于Fragment间数据共享
existingViewModel 获取现有的ViewModel,若没有则会出错
ViewModel中使用State
withState(viewModel) {}
奇怪的语法
点击一下方法,可以发现是EpoxyController的扩展方法,同时也发现这个内联函数是插件生成的。同时EpoxyController是第三方库
com.airbnb.android:epoxy:3.9.0
,github地址:
https://github.com/airbnb/epoxy
Epoxy
简化RecycleView使用,尤其是在有多种ViewType的时候。Epoxy的主要作用有两个,第一,简化RecyclerView多ViewType的开发;第二,如果数据变化,会自动进行更新
两个重要组件
EpoxyModel:描述了某个view如何在RecyclerView中显示
EpoxyController:确定哪些item显示在RecyclerView中
EpoxyModel
@ModelView注解该class,告诉Epoxy这是一个EpoxyModel
@ModelProp注解一个方法,为该EpoxyModel增加一个属性
@TextProp 标示这个属性是字符串
还有其他属性可以在实际使用中查找
EpoxyController
buildModels中添加RecycleView中的item,这个回调就是最开我们看到的奇怪地方;其中RecycleView中的item列表就是:marquee、showcaseCarousel、loadingView
和animationItemView
到这里主页面的结构就都梳理清楚了