HarmonyOS 实战教程(十):项目总结与扩展实践 —— 以「柚兔自测量表」为例
·
一、项目全貌回顾
经过前九篇的深入讲解,我们已经完整剖析了「柚兔自测量表」MeCharts 项目的核心技术实现。让我们回顾整体架构:
MeCharts 应用架构全景
┌──────────────────────────────────────────────────────┐
│ 表现层 (UI) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ HomeView │ │ConsultView│ │ MineView │ (Tab页面)│
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 答题页 │ 结果页 │ 历史页 │ 聊天页 │ 关于页 │Web页│ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ TopBar │ CustomTabBar │ CardItem │ RadioGroup │ │
│ └─────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────┤
│ 业务层 (Model) │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ChatModel │ │GlobalInfo│ │BackupManagerSvc │ │
│ │ (AI会话) │ │ Model │ │ (云服务管理) │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
├──────────────────────────────────────────────────────┤
│ 数据层 (Data) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │IBestORM │ │HttpManager│ │DataModel │ │
│ │(本地存储)│ │(网络请求) │ │(量表数据)│ │
│ └──────────┘ └──────────┘ └──────────┘ │
├──────────────────────────────────────────────────────┤
│ 基础设施层 (Util) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │WindowUtil│ │PageContext│ │Breakpoint│ │
│ │(窗口管理)│ │(导航封装) │ │ System │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ToastUtil │ │DateUtils │ │ Logger │ │
│ │(提示工具)│ │(日期工具)│ │(日志工具)│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────────────────────────────────────┘
二、核心技术要点总结
2.1 ArkUI 组件与装饰器
| 装饰器 | 用途 | 项目中的使用场景 |
|---|---|---|
@Entry |
页面入口 | Index 主页 |
@Component |
组件声明 | MineView、ConsultView 等 |
@ComponentV2 |
新版组件声明 | HomeView、TopBar、BestRadioGroup |
@State |
组件内可变状态 | isLoggedIn、chatList 等 |
@Local |
V2组件内可变状态 | title、score、activeStates |
@Prop |
父子单向传递 | currentIndex、item |
@Param |
V2组件参数 | title、showBackButton |
@Event |
V2组件事件回调 | onBack、onChange |
@StorageProp |
全局状态单向绑定 | globalInfoModel |
@Observed |
类可观测 | AbcModel、ChatData |
@ObjectLink |
嵌套对象双向绑定 | RecordItem 中的 item |
@Builder |
轻量 UI 复用 | buildTopBar、buildContent |
@BuilderParam |
UI 插槽 | TopBar 的 rightContent |
@Monitor |
状态变化监听 | BestRadioGroup 的 selectedValue |
2.2 Navigation 路由体系
// 核心流程
Navigation(navPathStack) // 绑定导航栈
└── NavDestination() // 子页面容器
.onReady((ctx) => { // 接收参数
const params = ctx.pathInfo.param as Type;
})
// 导航操作
pageContext.openPage({...}) // 入栈
pageContext.popPage() // 出栈
pageContext.replacePage({...}) // 替换当前页
// 路由注册
@Builder
export function XxxPageBuilder() {
XxxPage()
}
2.3 状态管理策略
组件内状态:@State / @Local
↓ 单向传递
父子传递:@Prop / @Param
↓ 事件回调
事件通知:@Event / 箭头函数
↓ 跨组件共享
全局状态:AppStorage + @StorageProp / @StorageLink
↓ 跨页面通信
事件总线:emitter
2.4 数据持久化
IBest-ORM 装饰器驱动:
@Table → 自动建表
@Field → 自动建列
AutoMigrate → 自动迁移
Table().Where().Find() → 链式查询
Create() / Update() → 增改操作
应用场景:
Last 表 → 量表最新分数
History 表 → 测评历史记录
2.5 网络请求封装
三层架构:
HttpRequest(基类:请求执行 + 响应解析)
→ GetRequest / PostRequest / PostBodyRequest(子类:请求配置)
→ HttpManager(管理器:单例 + 统一错误处理)
→ ChatModel(业务模型:AI 会话逻辑)
2.6 响应式布局
BreakpointType<T>:
根据断点返回不同值(方向/尺寸/边距)
GlobalInfoModel:
存储设备信息(断点/状态栏高度/导航条高度)
安全区域避让:
TopBar → top: statusBarHeight
页面 → bottom: naviIndicatorHeight
内容 → margin: tabBarHeight + naviIndicatorHeight
三、项目亮点与设计模式
3.1 单例模式
MeCharts 中多处使用单例模式确保全局唯一实例:
// HttpManager
static getInstance(): HttpManager
// ChatModel
static getInstance(): ChatModel
// BackupManagerService
static getInstance(): BackupManagerService
// BreakpointSystem
static getInstance(): BreakpointSystem
3.2 封装思想
PageContext封装NavPathStack,统一导航操作HttpManager封装 HTTP 请求,统一错误处理ToastUtil封装promptAction.showToast,统一提示样式WindowUtil封装窗口操作,统一沉浸式配置TopBar封装顶部导航栏,统一页面头部
3.3 组件化复用
TopBar:10+ 个页面复用,通过参数差异化BestRadioGroup+RadioItem:7 种量表复用CardItem:AI 工具卡片复用SettingItem:设置列表项复用RecordItem:历史记录项复用
3.4 页面复用
MoveListPage:多动症、SDS、SAS 三种量表共用一个页面WebPage:用户协议、隐私政策、反馈建议、健康资讯共用
四、可扩展方向
4.1 流式 AI 对话
当前 AI 对话使用非流式模式 + 轮询,可升级为 SSE(Server-Sent Events)流式输出:
// 流式请求示例
chat(conversationId: string, content: string): void {
let request = new PostTRequest<ChatResponseData>({
stream: true,
// ...
}, UrlConstants.CHAT_URL);
request.onDataReceived = (chunk: string) => {
// 实时更新聊天内容
this.chatList[this.chatList.length - 1].content += chunk;
};
}
4.2 数据可视化
测评结果可以增加图表展示,如雷达图、趋势图等:
// 使用 @ohos/chartops 或自定义 Canvas 绘制
Canvas(this.context)
.width('100%')
.height(200)
.onReady(() => {
// 绘制雷达图/折线图
})
4.3 多语言国际化
当前项目仅支持中文,可通过资源限定词扩展多语言:
resources/
en/element/string.json # 英文
zh/element/string.json # 中文
代码中已使用 $r('app.string.xxx') 引用字符串,国际化扩展成本低。
4.4 暗色模式
HarmonyOS 支持暗色模式,通过资源限定词自动切换:
resources/
dark/element/color.json # 暗色颜色
base/element/color.json # 亮色颜色
4.5 性能优化
- LazyForEach 替代 ForEach:大数据列表使用 LazyForEach 按需渲染
- renderGroup:静态内容区域启用渲染分组,减少重绘范围
- cachedCount:Swiper/List 设置合理的缓存数量
- 图片缓存:Web 组件和 Image 组件启用缓存策略
4.6 单元测试
MeCharts 已包含测试目录结构:
entry/src/test/
├── List.test.ets
└── LocalUnit.test.ets
entry/src/ohosTest/
└── ets/test/
├── Ability.test.ets
└── List.test.ets
可扩展测试覆盖:
- 计分逻辑的单元测试
- 数据库 CRUD 的集成测试
- 页面导航的 UI 测试
五、HarmonyOS 开发最佳实践
5.1 代码规范
- 遵循 ArkTS 严格模式约束,不使用
any/unknown/as - 统一使用
$r()引用资源,避免硬编码字符串和颜色 - 常量集中定义在
constant/目录 - 工具类无状态化,优先使用静态方法
5.2 状态管理原则
- 组件内状态用
@State/@Local - 跨组件共享用
AppStorage - 避免过度使用
@Watch/@Monitor,可能导致性能问题 @Observed+@ObjectLink处理嵌套对象的深度观测
5.3 生命周期管理
aboutToAppear:初始化数据、注册监听aboutToDisappear:释放资源、移除监听onReady(NavDestination):接收路由参数- 避免在
build()中执行耗时操作
5.4 导航最佳实践
- 统一使用
Navigation + NavPathStack - 封装导航操作,不直接操作栈
replacePage用于不可返回的场景(如答题→结果)openPage + onReturn用于需要回传数据的场景
六、完整技术栈清单
| 类别 | 技术/框架 |
|---|---|
| 开发语言 | ArkTS |
| UI 框架 | ArkUI(声明式) |
| IDE | DevEco Studio |
| 导航 | Navigation + NavPathStack |
| 状态管理 | @State/@Local + AppStorage |
| 网络请求 | @kit.NetworkKit |
| 本地存储 | @ibestservices/ibest-orm |
| 云服务 | backup_air(登录+备份) |
| AI 平台 | 扣子 Coze API |
| 轮播组件 | @hw-agconnect/ui-swiper |
| 动画 | @jjr/lottie_component |
| 响应式布局 | 自定义 BreakpointType |
| 事件通信 | @kit.BasicServicesKit.emitter |
| 窗口管理 | @kit.ArkUI.window |
七、总结
通过十篇实战教程,我们从项目架构、生命周期管理、导航体系、首页布局、量表答题、结果展示、本地存储、网络请求、AI 咨询、个人中心、响应式布局等维度,完整剖析了一个 HarmonyOS 商业级应用的技术实现。MeCharts 项目展示了以下开发范式:
- 分层架构:表现层、业务层、数据层、基础设施层职责清晰
- 组件化开发:通用组件高复用、页面组件参数化
- 声明式 UI:状态驱动 UI,数据变化自动刷新视图
- 响应式设计:一套代码适配多种设备
- 服务集成:华为云服务(登录、备份)和第三方 AI 平台无缝集成
希望本系列教程能帮助你在 HarmonyOS 开发之路上少走弯路,快速构建高质量应用。
更多推荐

所有评论(0)