MVVM & compose

Abstract

本文旨在总结pos开发过程中使用compose ui进行业务开发时,对mvvm思想在pos系统中实践的总结。

Intro

在日常的 Android 开发中,MVVM 架构和 Compose UI 已经成为主流的开发方式。在我的 POS 系统的实际开发过程中,观察发现将 MVVM 的分层思想和 Compose UI 的响应式特性结合起来,不仅让界面和业务逻辑分工更明确,也让代码更容易维护和扩展。比如在购物车、update等模块,界面只负责展示和收集用户操作,具体的业务处理都交给 ViewModel。对于校招同学来说,理解和掌握这些实践经验,有助于更快上手实际业务开发。通过归纳总结,自己整理的MVVM相关知识如下。

MVVM的核心构成

MVVM 模式由三个核心组件构成:

  • Model: 负责数据层,提供原始数据
  • ViewModel: 处理业务逻辑,维护 UI 状态
  • View: 负责 UI 渲染,响应用户交互

MVVM的单向数据流

在 MVVM 中,数据流动遵循单向原则:

  1. ViewModel 管理状态(State)
  2. View 观察并展示状态
  3. 用户操作触发 Action
  4. Action 传递给 ViewModel 处理
  5. ViewModel 更新状态,循环往复

ViewModel -> State -> View -> Action -> ViewModel

Compose UI 中的 MVVM 实践方式

Compose UI 作为现代化的 View 层实现:

  1. 响应式更新

    • 自动观察 ViewModel 中的状态变化
    • 基于状态变化进行 UI 重组
  2. 职责分离

    • View 层:专注于 UI 展示逻辑
    • ViewModel 层:专注于业务逻辑和状态管理
  3. 解耦效果

    • UI 修改仅需关注 View 层
    • 业务逻辑修改仅需关注 ViewModel 层
    • 降低模块间耦合度,提高代码可维护性

Method

在一个业务场景中,如果需要实现一个功能,由用户行为触发某些视图的更新,实现思路如下:

UI 层只负责 UI 展示,并收集状态,展示不同的交互效果

  • 通常定义在名为,view文件夹 / View.kt / Component.kt 等结尾,的文件中
  • *通过@Composable 定义组件;通过@preview预览对应组件

基础要素

  • 在 View 层收集状态
  • 利用 collectAsState() 观察状态变化,实现数据驱动 UI 更新的闭环
  • 在 View 层完成状态到 UI 的映射
  • 利用when (State.value) 进行条件判断,并根据对应的state展示对应需要展示的ui

向上传递用户事件

  • *最基础的事件上报方式:*直接调用 ViewModel 方法
  • *传递必要的参数给 ViewModel:*传递带参数的事件

保持组件内部状态

利用remember +mutableStateOf() 传递状态变化的值,比如:

  • UI 临时状态
  • 动画状态
  • 用户输入缓存
  • 仅影响UI展示的状态

避免 ⚠️

  1. 不在 View 层处理业务逻辑

  2. 不在 View 层直接修改状态

  3. 不在 View 层保存全局状态

  4. 避免组件间强耦合

  5. 不在 View 层处理业务逻辑

  6. 不在 View 层直接修改状态

  7. 不在 View 层保存全局状态

  8. 避免组件间强耦合

ViewModel 负责更新视图变化相关的业务逻辑

  • 通常定义在名为'ViewModel'等结尾的文件夹中

通过@Composable 定义组件;通过@preview预览对应组件

基础要素

  • 负责业务逻辑处理、状态管理和数据转换,确保 UI 层专注于展示和交互。
  • 作为 UI 层与数据层(Repository、UseCase 等)之间的桥梁,协调数据流动。

状态管理

  • 内部使用MutableStateFlow 保存和更新状态,保证状态的可变性和响应性。
  • 对外仅暴露 StateFlow,确保外部只能读取状态,不能直接修改,提升封装性和安全性。

事件处理

  • 接收来自 UI 层的用户事件(如点击、输入等),在 ViewModel 内部处理业务逻辑。
  • 根据事件结果更新 MutableStateFlow,驱动 UI 层自动响应状态变化。

数据转换 与 生命周期感知

  • 负责将数据层返回的原始数据转换为 UI 层所需的状态或数据结构,简化 UI 层逻辑。
  • ViewModel 生命周期与 UI 组件(如 Activity、Fragment、Composable)绑定,自动管理资源释放,避免内存泄漏。

避免 ⚠️

  • 不直接操作 UI 元素或进行 UI 渲染。
  • 不保存与 UI 展示无关的全局状态。
  • 不在 ViewModel 层处理具体的视图逻辑或动画,仅关注数据和业务。

Conclusion

MVVM 架构通过 Model、ViewModel 和 View 的三层分离,实现了业务逻辑与 UI 的彻底解耦。Compose UI 的响应式特性,让这种分层思想在实际开发中落地得更加高效和自然。

相关推荐
有事没事实验室1 分钟前
node.js中的path模块
前端·css·node.js·html·html5
十盒半价12 分钟前
TypeScript + React:大型项目开发的黄金搭档
前端·typescript·trae
楚轩努力变强1 小时前
前端工程化常见问题总结
开发语言·前端·javascript·vue.js·visual studio code
鱼樱前端1 小时前
rust基础二(闭包)
前端·rust
菜鸟学Python1 小时前
Python web框架王者 Django 5.0发布:20周年了!
前端·数据库·python·django·sqlite
前端开发爱好者2 小时前
只有 7 KB!前端圈疯传的 Vue3 转场动效神库!效果炸裂!
前端·javascript·vue.js
pe7er2 小时前
RESTful API 的规范性和接口安全性如何取舍
前端·后端
Fly-ping2 小时前
【前端】JavaScript文件压缩指南
开发语言·前端·javascript
未来之窗软件服务3 小时前
免费版酒店押金原路退回系统之【房费押金计算器】实践——仙盟创梦IDE
前端·javascript·css·仙盟创梦ide·东方仙盟·酒店押金系统
拾光拾趣录3 小时前
常见 HTTP 请求头:从“为什么接口返回乱码”说起
前端·http