HarmonyOS应用实战-启示散页-48-HAR 公共模型别引 UI 依赖:让 Deck、Answer 和 Result 保持纯净
HarmonyOS应用实战-启示散页-48-HAR 公共模型别引 UI 依赖让 Deck、Answer 和 Result 保持纯净公共模型一开始只是 Deck、Answer、Favorite。页面需要一个展示字段时开发者很容易顺手把 State、NavPathStack 或页面类型塞进模型。这样数据层开始依赖 ArkUI测试、迁移和跨模块复用都会被页面生命周期拖住。这篇文章解决四件事还原这个问题在答案之书这类离线应用里如何出现。明确页面、Service、Repository、AppStorage 或发布清单各自的责任。给出可迁移的 ArkTS/工程代码片段并说明反例为什么会留下隐患。用验证清单和排障表把方案收成可执行检查项。公共模型一旦懂 UI分层就失效了Deck 和 Answer 是业务事实不应该知道自己在卡片、Sheet 还是结果页里展示。页面需要的折叠状态、选中状态、动画阶段都属于展示模型。把这些字段塞进 HAR会让每个消费者都被迫理解页面状态。已核对的模块职责是HAR 承载 Deck、Answer、Favorite、PreferencesStore、Repository、Tokens 和 RoutesHSP 承载页面与服务。本文强调现有边界并给出静态检查方法。把领域模型、展示模型和页面状态分开先写 owner 表再写代码。否则代码能跑起来却很难说明失败时该由谁回滚、重启后该由谁恢复、其他页面该根据什么信号刷新。Owner负责什么不负责什么HAR models保存 Deck、Answer、Favorite 等纯数据引入 State、Builder、NavPathStackHAR repositories读写本地数据和 schema决定页面交互HSP services把领域数据组装成页面需要的结果污染 HAR 类型ArkUI pages维护展开、选中、动画等临时状态改写领域事实Deck 和 Answer 只保留业务字段模型要表达本链路需要的稳定事实不要把页面临时状态或底层存储细节暴露出去。这样后续迁移 Preferences schema、拆模块或增加发布检查时调用方不必跟着重写。exportinterfaceAnswer{id:string;text:string;sourceDeckId:string;createdAt:number;}exportinterfaceDeck{id:string;name:string;colorKey:string;answers:Answer[];updatedAt:number;}这段模型的重点有三点字段命名贴近业务输入输出能覆盖失败分支没有携带 ArkUI 组件状态。页面拿它展示Service 拿它做判断Repository 不需要知道页面长什么样。展示模型在 HSP 组装不回写 HARService 是规则 owner。凡是涉及校验、回滚、冲突、恢复、隐私或发布证据的逻辑都不要散落在组件回调里。interfaceAnswerCardModel{answerId:string;previewText:string;fullText:string;fromDeckName:string;canFavorite:boolean;}classAnswerCardMapper{toCard(answer:Answer,deck:Deck):AnswerCardModel{constpreviewTextanswer.text.length80?${answer.text.slice(0,80)}...:answer.text;return{answerId:answer.id,previewText,fullText:answer.text,fromDeckName:deck.name,canFavorite:true};}}这里的 Service 不追求复杂抽象只做一件事把输入转成可解释结果。页面可以做乐观交互但最终事实必须从 Service 返回。Repository 返回领域对象不返回页面对象Repository 负责稳定读写、默认值和 schema 兼容。它不弹 Toast不决定按钮状态也不拼页面文案。classDeckRepository{asyncloadDeck(deckId:string):PromiseDeck|null{constrawawaitPreferencesStore.getJsonDeck(deck_store,deckId);if(!raw){returnnull;}returnnormalizeDeck(raw);}}如果这一层缺失页面会被迫知道 store name、key、默认值和异常处理细节。写到后面所有页面都会变成半个仓储层。页面状态留在页面别写进 Answer页面只消费结果、展示状态、触发动作。跨页面刷新用轻量信号完整业务对象继续由 Service 重新读取。Componentstruct AnswerCard{Propmodel:AnswerCardModel;Stateprivateexpanded:booleanfalse;build(){Column(){Text(this.expanded?this.model.fullText:this.model.previewText)Button(this.expanded?收起:查看全文).onClick((){this.expanded!this.expanded;})}}}这类写法的好处是入口可以扩展页面可以重进数据可以迁移。只要 Service 和 Repository 边界稳定页面不需要关心底层怎么保存。反例短期省事长期失控反例是在Answer里增加expanded: boolean、selected: boolean或pathStack: NavPathStack。这些字段只服务某个页面却会污染所有仓储、导入、备份和测试用例。更具体地说反例通常有三个共同点直接写持久化、没有失败结果、没有刷新 owner。它们在单次手测里很难暴露但在重启、返回、跨入口或发布复查时会变成真实问题。排查顺序\n1. 先找唯一写入 owner。\n2. 再看失败是否返回可展示结果。\n3. 再看刷新信号是否只通知相关页面。\n4. 最后才检查 UI 展示。验证路径不要只走正常操作在 HAR 里搜索 ArkUI 装饰器和页面类型确认模型不依赖 UI。用内存仓储测试 DeckRepository确认不需要启动 ArkUI 页面。长答案展示用 AnswerCardModel 截断复制和收藏仍使用 fullText。HSP 页面变更不要求迁移 HAR 存储 schema。验证时建议把“正常路径、异常输入、重启恢复、跨入口刷新、发布态检查”分开记录。构建通过只能证明语法和资源能打包不能证明这些运行链路都已经被真机验证。rg-nPreferencesStore|AppStorage.setOrCreate|Repository|ServiceD:\\ProgramData\\huawei\\lesson\\The_Book_of_Answers\nrg-nquestion|answerText|deckName|hilogD:\\ProgramData\\huawei\\lesson\\The_Book_of_Answers常见问题与处理现象先看哪里处理测试 HAR 时必须引页面包模型是否引用 ArkUI 类型把展示字段移到 HSP备份文件出现 expanded 字段是否序列化页面状态备份只读领域模型多个页面展示互相影响临时状态是否写入 Answer页面状态留在组件内处理这些问题时不要先改 UI 文案。先确认写入 owner、读取 owner 和刷新信号是否一致再看页面是否正确消费结果。若只在页面补一个 Toast用户当次可能看到了提示但重启、返回、跨入口和发布复查仍然会暴露同一个根因。落地取舍这套方案不是为了把轻量应用写重而是为了把真正会跨页面、跨启动、跨发布阶段的事实收住。只影响当前展示节奏的变量可以留在页面会改变用户内容、持久结构、隐私口径或发布证据的逻辑必须进入 Service、Repository 或发布清单。判断点建议位置原因只影响当前按钮、弹层或动画页面State不需要跨入口复用会写本地数据或读持久事实Service Repository需要校验、回滚和恢复会影响其他页面刷新AppStorage 时间戳通知变化不共享完整对象会影响发布、截图、隐私或诊断发布清单或运行账本后续复查需要证据真正落地时可以先从一条最容易复现的路径开始找出唯一写入点补上结果模型再把页面里的直接读写替换成 Service 调用。这个顺序比一次性重构全部页面更稳也更容易在评审时说明每一行代码解决了哪个故障链。评审记录里最好保留对应的命令、截图或复现步骤避免方案只停留在口头约定。小结HAR 的价值是稳定和可复用。Deck、Answer、Result 只描述领域事实页面需要的摘要、展开、按钮状态由 HSP 服务或组件模型生成。这样应用拆包、测试和备份都能围绕纯数据工作不被 ArkUI 生命周期牵住。码解决了哪个故障链。评审记录里最好保留对应的命令、截图或复现步骤避免方案只停留在口头约定。小结HAR 的价值是稳定和可复用。Deck、Answer、Result 只描述领域事实页面需要的摘要、展开、按钮状态由 HSP 服务或组件模型生成。这样应用拆包、测试和备份都能围绕纯数据工作不被 ArkUI 生命周期牵住。

相关新闻

[Android] TV 迅雷云盘 -TV纯净版+支持4K、HDR播放等

[Android] TV 迅雷云盘 -TV纯净版+支持4K、HDR播放等

[Android] TV 迅雷云盘 -TV纯净版支持4K、HDR播放等 链接:https://pan.xunlei.com/s/VOyYC93W4rzN75x_oB7j5W6tA1?pwdsk32# 一款可以在电视上使用的云盘工具app。集成了迅雷强大的云盘服务,可以将用户的文件和媒体内容同步至电视端,提供无…

2026/7/28 1:00:55阅读更多 →
[Android] 万能遥控 -一键遥控所有家电+免费无广告

[Android] 万能遥控 -一键遥控所有家电+免费无广告

[Android] 万能遥控 -一键遥控所有家电免费无广告 链接:https://pan.xunlei.com/s/VOyY85h0_QYD4MA1RpwbuqgBA1?pwdxqsq# 一款支持空调,电视,机顶盒,网络盒子,DVD,投影仪等多种电器,是真正…

2026/7/28 1:00:55阅读更多 →
[Android] 作业全能王 -作业扫描批改学习工具

[Android] 作业全能王 -作业扫描批改学习工具

[Android] 作业全能王 -作业扫描批改学习工具 链接:https://pan.xunlei.com/s/VOyY2venYXItcCAJez-gYshcA1?pwdtwzi# 多功能智能扫描工具,适配学生、家长、老师使用,集试卷处理、笔记扫描、OCR文字识别、拍照翻译、证件扫描、PDF转换于一…

2026/7/28 1:00:55阅读更多 →
沐神-动手学深度学习4.1多层感知机MLP课后习题

沐神-动手学深度学习4.1多层感知机MLP课后习题

这篇文章正式带你进入了**“深度学习”的大门。之前的线性回归和 Softmax 回归都只有一层,而这一节介绍的多层感知机(MLP)**通过增加“隐藏层”,让模型拥有了处理复杂非线性问题的能力。 通俗解释:什么是多层感知机&am…

2026/7/28 2:15:04阅读更多 →
沐神-动手学习深度学习,课后习题 3.7. softmax回归的简洁实现

沐神-动手学习深度学习,课后习题 3.7. softmax回归的简洁实现

答案 以下是针对3.7节softmax回归简洁实现中两个练习的详细解答:练习1:调整超参数的影响批量大小(Batch Size) 增大批量大小(如512): 训练速度加快(每个epoch耗时减少)梯…

2026/7/28 2:15:04阅读更多 →
企业级AI编程工具选型与实施指南

企业级AI编程工具选型与实施指南

1. 企业级AI编程工具的市场需求分析 在当今快节奏的软件开发环境中,企业开发团队面临着代码质量不稳定、开发效率瓶颈和知识传承断层三大核心痛点。根据2023年Stack Overflow开发者调查报告显示,超过67%的专业开发者表示他们每天需要花费30%以上的工作时…

2026/7/28 2:15:04阅读更多 →
SpringBoot+Vue高校教务管理系统开发实践与优化

SpringBoot+Vue高校教务管理系统开发实践与优化

1. 项目概述:SpringBootVue高校教务管理系统开发实录去年为某地方高校开发教务管理系统时,我采用SpringBootVue技术栈实现了学生成绩与课程管理的全流程数字化。这个典型的教务管理系统包含学生选课、教师评分、课表查询等核心功能模块,通过前…

2026/7/28 2:15:04阅读更多 →
基于Flink的实时数据血缘与作业状态监控实践

基于Flink的实时数据血缘与作业状态监控实践

1. 项目背景与核心价值在实时数据处理领域,Apache Flink已经成为事实上的标准框架之一。随着企业数据治理要求的不断提高,数据血缘(Lineage)追踪和作业状态监控逐渐成为数据平台不可或缺的功能。传统做法往往需要人工维护作业状态…

2026/7/28 2:15:04阅读更多 →
3分钟快速上手:SillyTavern AI聊天前端完整安装指南

3分钟快速上手:SillyTavern AI聊天前端完整安装指南

3分钟快速上手:SillyTavern AI聊天前端完整安装指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是否正在寻找一款功能强大且易于使用的AI聊天前端工具?SillyT…

2026/7/28 2:13:03阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →