及时做APP开发实战(一)-MVVM架构设计实践

发布时间:2026/7/14 2:06:43

及时做APP开发实战(一)-MVVM架构设计实践
及时做APP开发实战(一)-MVVM架构设计实践本文将详细介绍如何在HarmonyOS NEXT应用中实现MVVM架构以及时做番茄待办应用为例展示分层设计的最佳实践。一、为什么选择MVVM架构在移动应用开发中良好的架构设计是项目可维护性和扩展性的基石。MVVMModel-View-ViewModel模式通过清晰的职责分离让代码更易于理解和维护。1.1 传统开发模式的痛点很多初学者习惯将所有代码写在页面组件中导致代码臃肿一个文件动辄上千行难以测试业务逻辑与UI耦合复用困难相同逻辑重复编写维护成本高修改一处影响多处1.2 MVVM的优势MVVM模式通过三层分离解决了上述问题┌─────────────────────────────────────┐ │ View视图层 │ │ 负责UI展示和用户交互 │ └──────────────┬──────────────────────┘ │ 数据绑定 ┌──────────────▼──────────────────────┐ │ ViewModel业务逻辑层 │ │ 负责业务处理和状态管理 │ └──────────────┬──────────────────────┘ │ 数据操作 ┌──────────────▼──────────────────────┐ │ Model数据模型层 │ │ 负责数据定义和存储 │ └─────────────────────────────────────┘【图1MVVM架构层次示意图】二、项目结构设计在及时做应用中我们采用以下目录结构entry/src/main/ets/ ├── model/ # 数据模型层 │ ├── TodoItem.ets # 待办任务模型 │ └── PomodoroRecord.ets # 番茄钟记录模型 ├── viewmodel/ # 业务逻辑层 │ ├── TodoViewModel.ets # 待办业务管理 │ └── PomodoroViewModel.ets # 番茄钟业务管理 ├── utils/ # 工具类层 │ ├── PreferencesHelper.ets # 持久化服务 │ └── CommonUtil.ets # 通用工具 └── pages/ # UI页面层 └── Index.ets # 主页面这种结构清晰明了每层职责分明model定义数据结构不包含业务逻辑viewmodel处理业务逻辑协调model和viewutils提供通用功能如存储、格式化等pages负责UI渲染和用户交互【图2项目目录结构截图】三、Model层设计Model层是数据的基础我们使用ArkTS的interface定义数据结构。3.1 待办任务模型/** * 待办任务数据模型 */exportinterfaceTodoItem{/** 唯一标识使用时间戳生成 */id:number;/** 任务文本内容 */text:string;/** 完成状态 */completed:boolean;/** 创建时间戳 */createdAt:number;/** 番茄钟完成次数 */pomodoroCount:number;}/** * 创建新的待办任务 */exportfunctioncreateTodoItem(text:string):TodoItem{return{id:Date.now(),text:text,completed:false,createdAt:Date.now(),pomodoroCount:0};}设计要点使用interface而非classArkTS推荐使用interface定义纯数据结构语义化命名每个字段都有清晰的注释说明工厂函数提供createTodoItem简化对象创建时间戳ID使用Date.now()生成唯一标识3.2 番茄钟记录模型/** * 番茄钟记录数据模型 */exportinterfacePomodoroRecord{/** 唯一标识 */id:number;/** 关联的待办任务ID */todoId:number;/** 单次专注时长分钟 */duration:number;/** 完成时间戳 */completedAt:number;}/** * 创建新的番茄钟记录 */exportfunctioncreatePomodoroRecord(todoId:number,duration:number):PomodoroRecord{return{id:Date.now(),todoId:todoId,duration:duration,completedAt:Date.now()};}注意todoId字段的设计它建立了番茄钟记录与待办任务的关联关系这是关系型数据建模的关键。四、ViewModel层实现ViewModel是MVVM的核心它承上启下既管理数据又为View提供服务。4.1 待办业务管理import{TodoItem,createTodoItem}from../model/TodoItem;import{PreferencesHelper}from../utils/PreferencesHelper;/** * 待办任务业务逻辑管理类 */exportclassTodoViewModel{privatepreferencesHelper:PreferencesHelper|nullnull;privatetodoList:TodoItem[][];/** * 初始化ViewModel */asyncinit():Promisevoid{this.preferencesHelperawaitPreferencesHelper.getInstance();awaitthis.loadTodoList();}/** * 加载待办列表 */privateasyncloadTodoList():Promisevoid{if(this.preferencesHelper){this.todoListawaitthis.preferencesHelper.getTodoList();}}/** * 添加新待办 */asyncaddTodo(text:string):PromiseTodoItem{consttodocreateTodoItem(text);this.todoList.push(todo);if(this.preferencesHelper){awaitthis.preferencesHelper.addTodo(todo);}returntodo;}/** * 切换待办完成状态 */asynctoggleTodoComplete(todoId:number):Promisevoid{consttodothis.todoList.find(itemitem.idtodoId);if(todo){todo.completed!todo.completed;awaitthis.updateTodo(todo);}}/** * 获取未完成的待办数量 */getActiveTodoCount():number{returnthis.todoList.filter(item!item.completed).length;}}【图3主页图】4.2 设计要点解析异步初始化init方法使用async/await处理异步加载内存缓存todoList保持内存中的数据减少IO操作单一职责每个方法只做一件事错误处理通过null检查避免空指针异常4.3 番茄钟业务管理exportclassPomodoroViewModel{privatepreferencesHelper:PreferencesHelper|nullnull;privatetodoViewModel:TodoViewModel|nullnull;privaterecords:PomodoroRecord[][];// 番茄钟配置privatestaticreadonlyDEFAULT_DURATION25;privatestaticreadonlySHORT_BREAK5;privatestaticreadonlyLONG_BREAK15;/** * 完成一次番茄钟 */asynccompletePomodoro(todoId:number,duration:numberPomodoroViewModel.DEFAULT_DURATION):PromisePomodoroRecord{constrecordcreatePomodoroRecord(todoId,duration);this.records.push(record);if(this.preferencesHelper){awaitthis.preferencesHelper.addPomodoroRecord(record);}// 更新待办的番茄钟完成次数if(this.todoViewModel){awaitthis.todoViewModel.incrementPomodoroCount(todoId);}returnrecord;}/** * 获取今日专注总时长 */getTodayTotalDuration():number{consttodaynewDate();today.setHours(0,0,0,0);consttodayTimestamptoday.getTime();returnthis.records.filter(recordrecord.completedAttodayTimestamp).reduce((total,record)totalrecord.duration,0);}}这里体现了ViewModel之间的协作PomodoroViewModel需要通知TodoViewModel更新番茄钟计数。五、View层使用示例在页面组件中我们通过ViewModel获取和操作数据import{TodoViewModel}from../viewmodel/TodoViewModel;EntryComponentstruct Index{StatetodoList:TodoItem[][];privatetodoViewModel:TodoViewModelnewTodoViewModel();asyncaboutToAppear(){awaitthis.todoViewModel.init();this.todoListthis.todoViewModel.getTodoList();}build(){Column(){// UI渲染ForEach(this.todoList,(todo:TodoItem){Text(todo.text).onClick(async(){awaitthis.todoViewModel.toggleTodoComplete(todo.id);this.todoListthis.todoViewModel.getTodoList();})})}}}关键点生命周期初始化在aboutToAppear中初始化ViewModel状态管理使用State装饰器实现响应式更新数据绑定UI直接绑定ViewModel的数据六、架构优势总结通过MVVM架构我们实现了代码组织清晰每层职责明确易于定位代码可测试性强ViewModel可以独立测试不依赖UI复用性好ViewModel可在多个页面复用维护成本低修改业务逻辑不影响UI结构在HarmonyOS NEXT开发中MVVM模式与ArkUI的响应式特性完美契合是构建高质量应用的理想选择。七、最佳实践建议保持Model纯粹只定义数据结构不包含业务逻辑ViewModel单一职责一个ViewModel管理一类业务合理使用工具类通用功能抽取到utils层异步处理规范统一使用async/await处理异步操作错误处理完善关键操作添加try-catch和null检查通过这套架构及时做应用具备了良好的可扩展性为后续功能开发打下了坚实基础。

相关新闻

鸿蒙智能体开发实战:46.端A2A协议 - 智能体与鸿蒙应用直连

鸿蒙智能体开发实战:46.端A2A协议 - 智能体与鸿蒙应用直连

2026/7/14 2:06:43

## 前言 A2A(Agent-to-Agent)协议是鸿蒙智能体平台中用于智能体之间直接通信的标准化协议。它允许HarmonyOS设备上的每个应用都可以实现自己的应用内Agent(App Agent),与小艺的Client Agent通过标准协议进行对话&…

从预训练到小样本:自监督学习如何重塑数据稀缺时代的模型泛化

从预训练到小样本:自监督学习如何重塑数据稀缺时代的模型泛化

2026/7/14 2:06:43

1. 数据稀缺时代的挑战与机遇在AI领域摸爬滚打这么多年,我见过太多团队被数据问题卡脖子。想象一下:你要训练一个识别稀有鸟类物种的模型,但每种鸟只能找到十几张照片——这就是典型的小样本学习场景。传统深度神经网络动辄需要数百万标注样本…

鸿蒙原生开发手记:徒步迹 - @Watch 与 @ObjectLink 深入理解

鸿蒙原生开发手记:徒步迹 - @Watch 与 @ObjectLink 深入理解

2026/7/14 2:06:43

掌握状态监听和对象级响应,提升 ArkUI 状态管理能力一、前言 ArkUI 的状态管理体系中,除了基础的 State/Prop/Link 和跨级通信的 Provide/Consume,还有两个重要的装饰器:Watch 和 ObjectLink。 Watch:监听状态变化&…

YOLOv8蜜蜂识别检测系统:从环境配置到实战部署完整指南

YOLOv8蜜蜂识别检测系统:从环境配置到实战部署完整指南

2026/7/14 6:06:55

这次我们来看一个基于YOLOv8的蜜蜂识别检测系统,这是一个完整的目标检测项目,包含源码、数据集、模型权重和UI界面。对于想要学习YOLOv8实战应用或者需要开发农业监测、生物识别系统的开发者来说,这个项目提供了很好的起点。YOLOv8作为YOLO系…

2025年C++性能分析工具全景指南:从Perf到eBPF的实战工作流

2025年C++性能分析工具全景指南:从Perf到eBPF的实战工作流

2026/7/14 6:06:55

1. 项目概述:为什么C开发者必须关注性能分析工具?如果你是一名C开发者,无论你是深耕于游戏引擎、高频交易系统、嵌入式设备还是大规模后端服务,性能这个词一定是你日常工作中绕不开的“紧箍咒”。C以其对硬件资源的直接掌控能力和…

零信任彻底普及!2026企业网安标配:永不信任、永远验证

零信任彻底普及!2026企业网安标配:永不信任、永远验证

2026/7/14 6:06:55

📌 三句大白话,搞懂零信任爆火原因第一:传统边界安全彻底失效,零信任成唯一解。以前企业靠防火墙、内网外网隔离防护,现在远程办公、云办公、移动设备接入常态化,固定网络边界彻底瓦解,传统“内…

Mellanox IB卡驱动安装与模式切换实战解析

Mellanox IB卡驱动安装与模式切换实战解析

2026/7/14 6:06:55

1. Mellanox IB卡驱动安装全攻略 刚拿到Mellanox IB卡时,我最头疼的就是驱动安装。经过多次实战,我总结出一套适合新手的安装流程。以CentOS 8.2系统为例,当你把CX354A卡插入PCIe插槽后,系统其实已经自带了mlx4_core内核驱动。用…

无密码认证全面来袭!2026告别密码泄露,FIDO2成安全新标配

无密码认证全面来袭!2026告别密码泄露,FIDO2成安全新标配

2026/7/14 6:06:55

📌 三句大白话,读懂无密码安全革命第一:密码本身,就是最大的安全漏洞。弱密码、重复密码、密码泄露、暴力破解、钓鱼套取,90%的账号安全事故,根源都在“密码认证体系”本身,传统密码早已无法适配…

Wand-Enhancer:如何免费解锁WeMod专业版功能并实现远程控制?

Wand-Enhancer:如何免费解锁WeMod专业版功能并实现远程控制?

2026/7/14 5:56:55

Wand-Enhancer:如何免费解锁WeMod专业版功能并实现远程控制? 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为WeMod&a…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/13 7:41:16

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/13 20:43:10

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

2026/7/14 0:06:37

1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am…

2026普通文员学数据分析的价值

2026普通文员学数据分析的价值

2026/7/14 0:06:37

一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a…

2026从计划员到主管,生产管理者学数据分析有用吗?

2026从计划员到主管,生产管理者学数据分析有用吗?

2026/7/14 0:06:37

一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&…