项目介绍
- Github: Orbit-mvi
- 官网: Orbit Multiplatform
MVI框架的基本结构
- MVI框架的核心概念是构建一个
单项数据流♻️, 用户的操作/交互不能直接去改变UI - 页面交互仅通过
ViewModel函数来触发, 函数内部处理完业务(网络请求、计算等)后生成新的State对象并发出 - 一个独立的页面模块的所有UI状态仅由一个
State来完整的描述, UI只观察这一个State来改变界面
示例程序
- 预览
代码结构
- 为页面创建一个状态类
XXState,包含所有状态信息,注意state中的字段是val的,不可变的,每次页面刷新都是发出一个新的state对象
2. 为页面创建一个副作用类
XXEffect,一些一次性事件,类如Toast, Loading都放在这里
- 为页面创建ViewModel, 实现
ContainerHost接口,你可以在函数中做任意耗时操作不用考虑线程切换问题,不用担心卡UI,只需在业务完成后用reduce发出新的state
4. 实现页面逻辑, 此处为
Activity
总结
- 框架已经帮我们封装好了Kotlin协程和Flow的实现,我们只需要在viewModel中使用
intent{}即可, 并且侵入性较小,只需要viewModel实现一个接口就行 - 采用MVI模式,UI只观察自己的
state对象就行,state变了UI就自动跟随变化(唯一可信源),所有的用户操作都交给viewmodel函数 - 对于副作用,例如Toast,使用
postSideEffect()发出新的Effect对象 - 对于页面刷新,例如变更点赞数,使用
reduce,将state.copy()克隆一个新的对象并发出 - 本示例程序源代码: (全在MyActivity类中) Github