【Orbit-mvi】Android MVI 框架推荐与示例,简洁优雅的实现MVI代码结构, 称为MVVM+

2,645 阅读2分钟

项目介绍

MVI框架的基本结构

image.png

  • MVI框架的核心概念是构建一个单项数据流♻️, 用户的操作/交互不能直接去改变UI
  • 页面交互仅通过ViewModel函数来触发, 函数内部处理完业务(网络请求、计算等)后生成新的State对象并发出
  • 一个独立的页面模块的所有UI状态仅由一个State来完整的描述, UI只观察这一个State来改变界面

示例程序

  • 预览

ezgif-5-952bc63560.gif

代码结构

  1. 为页面创建一个状态类XXState,包含所有状态信息,注意state中的字段是val的,不可变的,每次页面刷新都是发出一个新的state对象

image.png 2. 为页面创建一个副作用类XXEffect,一些一次性事件,类如Toast, Loading都放在这里 image.png

  1. 为页面创建ViewModel, 实现ContainerHost接口,你可以在函数中做任意耗时操作不用考虑线程切换问题,不用担心卡UI,只需在业务完成后用reduce发出新的state

image.png 4. 实现页面逻辑, 此处为Activity

image.png

总结

  • 框架已经帮我们封装好了Kotlin协程和Flow的实现,我们只需要在viewModel中使用intent{}即可, 并且侵入性较小,只需要viewModel实现一个接口就行
  • 采用MVI模式,UI只观察自己的state对象就行,state变了UI就自动跟随变化(唯一可信源),所有的用户操作都交给viewmodel函数
  • 对于副作用,例如Toast,使用postSideEffect()发出新的Effect对象
  • 对于页面刷新,例如变更点赞数,使用reduce,将state.copy()克隆一个新的对象并发出
  • 本示例程序源代码: (全在MyActivity类中) Github