HarmonyOS应用实战-启示散页-06-仪式感动画不要卡业务:用 DrawingPage 隔离抽取和转场

发布时间:2026/9/14 21:44:59

HarmonyOS应用实战-启示散页-06-仪式感动画不要卡业务:用 DrawingPage 隔离抽取和转场 HarmonyOS应用实战-启示散页-06-仪式感动画不要卡业务用 DrawingPage 隔离抽取和转场答案之书需要一点仪式感提问、翻动、停顿、出现答案。但动画一旦和业务抽取绑在一起就很容易出问题。动画还没结束结果已经写历史用户返回了定时器还在跑抽取失败了页面仍播放到最终态。更稳的做法是把 DrawingPage 当成状态机把业务结果和转场节奏隔开。这篇文章会把问题拆成四个可落地的点用 DrawingPage 承接抽取流程不让首页直接处理动画。业务先拿结果动画按状态展示不反向决定数据。处理定时器清理、返回中断和失败态。让历史、收藏和页面显示都基于同一个抽取结果。1. 动画不能反过来驱动业务很多页面会写成“动画结束后再随机抽答案”。这会让业务结果依赖 UI 时间动画取消、页面返回、定时器丢失都会影响抽取。答案之书更稳的路径是先由 Service 得到结果再让 DrawingPage 根据结果播放揭示动画。privateasyncbegin():Promisevoid{this.phasedrawing;try{constresult:DrawAnswerResultawaitAnswerDrawService.draw({deckId:this.deckId,question:this.question});this.resultresult;this.phaserevealing;this.startRevealTimer();}catch(err){this.phasefailed;}}业务完成后才进入 revealing。动画可以慢一点但不能决定答案是否存在。2. 页面状态机要少而清楚DrawingPage 至少有 idle、drawing、revealing、done、failed 五种状态。不要用多个 boolean 拼状态例如loading showCard hasError后期很难判断组合是否合法。typeDrawingPhaseidle|drawing|revealing|done|failed;Stateprivatephase:DrawingPhaseidle;Stateprivateresult:DrawAnswerResult|nullnull;StateprivaterevealProgress:number0;单一 phase 能让 UI 分支和调试日志都更直接。出现异常时先看 phase 停在哪一步。3. 首页只传输入不参与抽取细节首页收集问题和当前题库 id然后跳转到 DrawingPage。它不应该提前随机也不应该写历史。这样首页可以保持轻抽取页成为完整流程的唯一拥有者。this.pathStack.pushPath({name:RouteName.Drawing,param:{deckId:this.currentDeckId,question:this.question.trim()}asDrawingParam});首页传的是上下文不是结果。DrawingPage 才负责拿结果、展示结果和交给历史服务。4. 参数进入页面先做兜底导航参数可能为空特别是调试、深链或后续扩展入口。DrawingPage 在aboutToAppear中解析参数缺失时给出错误态不要让空 deckId 进入 Service 后再出现难懂错误。interfaceDrawingParam{deckId:string;question?:string;}privatereadParam():DrawingParam|null{constparamthis.pathStack.getParamByName(RouteName.Drawing)asDrawingParam|undefined;if(!param?.deckId){returnnull;}returnparam;}参数校验是页面入口边界。Service 仍会校验但页面可以更早给用户可理解的反馈。5. 定时器必须跟页面生命周期绑定动画通常需要setTimeout或setInterval。如果页面返回后不清理定时器回调还会修改已离开的页面状态轻则日志异常重则状态错乱。答案之书需要在离开页面时清理所有动画句柄。privaterevealTimer:number-1;aboutToDisappear():void{if(this.revealTimer!-1){clearInterval(this.revealTimer);this.revealTimer-1;}}动画资源属于页面生命周期。页面消失后不再允许它继续推进状态。6. 历史写入放在结果确认点历史记录应该写在抽取结果生成后而不是动画彻底结束后。用户中途返回也代表这次抽取发生过如果产品希望只记录看完的答案那也要显式定义。答案之书更适合在拿到结果后记录历史。constresult:DrawAnswerResultawaitAnswerDrawService.draw(options);awaitHistoryService.appendFromDraw(result);this.resultresult;this.phaserevealing;历史的来源是领域结果不是动画帧。这样历史列表和收藏按钮都能使用同一个 result。7. 失败态要停住动画抽取失败时继续播放动画会让用户等到最后才看到空白。DrawingPage 应该在 Service 抛错后直接进入 failed并提供重试或返回。错误提示也应该区分“题库不存在”和“题库没有答案”。BuilderFailedPanel(){Column({space:12}){Text(this.errorMessage||暂时无法抽取答案)Button(返回题库选择).onClick(()this.pathStack.pop())}}失败态是流程的一部分不是兜底文案。只要业务可能失败UI 就要给出明确出口。8. 动画参数不要散落在 UI 里转场时长、进度步长、结果停顿时间最好集中成常量。这样后续调节仪式感时不会误改抽取逻辑。动画常量也能让真机调优更有依据。constREVEAL_TOTAL_MS:number1200;constREVEAL_TICK_MS:number40;privatestartRevealTimer():void{conststartedAt:numberDate.now();this.revealTimersetInterval((){this.revealProgressMath.min(1,(Date.now()-startedAt)/REVEAL_TOTAL_MS);if(this.revealProgress1){this.phasedone;clearInterval(this.revealTimer);}},REVEAL_TICK_MS);}动画参数集中后业务代码不需要因为“想慢一点”而被改动。9. 验证与排障DrawingPage 的验证要覆盖时间和中断快速返回、连续进入、抽取失败、动画未结束时收藏、切换题库后再抽。尤其要看定时器是否清理历史是否只写一次。验证点 1. 首页只负责 push DrawingPage 2. DrawingPage 进入后先拿 DrawAnswerResult 3. 返回页面后没有定时器继续打印日志 4. 抽取失败时 phasefailed不播放到 done 5. 历史记录不因动画重复触发而写两次如果页面偶发卡在 loading优先看 phase 切换和 Service 异常处理而不是只调动画时长。还有一个需要在评审时说清楚的边界返回不是业务失败。只要 Service 已经给出结果并写入历史用户中途离开只代表不再观看本次动画。相反如果 Service 还没有返回结果就离开页面页面要清理定时器和挂起状态不能在后台继续推进 UI。把这个边界写进状态机后续调动画节奏时就不会误伤数据链路。如果产品后来增加“再抽一次”也应该从 done 状态重新进入 drawing而不是复用上一轮 result 改文案。每一次抽取都有独立结果、独立历史写入和独立动画周期这样连续操作才不会把两次答案混在同一个页面状态里。验证清单清应用数据后从冷启动进入确认默认数据、页面状态和日志分支符合预期。对本文涉及的写路径准备正常、空值、重复、越界四类输入确认错误停在 Service 或 Repository。页面返回、重新进入、切换题库、收藏、历史或删除后确认对应刷新信号触发重新读取。修改资源或模块归属后重新构建确认 HAP、HAR、HSP 的依赖方向没有反转。涉及真机体验、备份恢复、发布素材的内容单独记录是否已经在设备或平台侧验证。常见问题与处理现象先看哪里处理方式返回后仍有动画日志aboutToDisappear 是否清理 timer记录并清理所有句柄抽取失败仍显示翻牌失败分支是否进入 failedService 抛错后停止动画历史重复写入是否在多个动画回调里 append只在拿到 DrawAnswerResult 后写一次首页越来越复杂首页是否承担抽取和动画首页只传 DrawingParam小结仪式感应该增强体验不能接管业务。DrawingPage 用状态机隔离抽取结果和动画节奏既能保留氛围也能让数据链路可控。
延伸阅读

更多相关文章

2026/9/11 5:38:26

专科生论文写作利器:10款AI工具实战指南

1. 专科生学术写作痛点与AI工具崛起(开头段自然引入主题,前100字含核心关键词) 最近在指导几位专科同学修改论文时,发现他们普遍面临三大难题:文献检索效率低、论文框架搭建困难、语言表达不够学术化。恰好这半年我系统…

2026/9/12 10:17:36

如何快速恢复丢失的Ren‘Py游戏源码:终极反编译工具指南

如何快速恢复丢失的RenPy游戏源码:终极反编译工具指南 【免费下载链接】unrpyc A renpy script decompiler 项目地址: https://gitcode.com/gh_mirrors/un/unrpyc 你是否曾经遇到过RenPy游戏项目源码丢失的尴尬情况?或者需要分析已编译的游戏脚本…

2026/9/14 21:40:34

车载360°全景影像实战:鱼眼相机标定与鸟瞰拼接全解析

"gods-eye-view"这个词直译过来是"上帝视角",放在车载影像、安防监控、机器人导航这些方向里,指的是用一个从上往下看的俯视画面观察全场景。前两年我做了一套基于四路鱼眼摄像头的车载360全景影像系统,也就是常说的AVM环…

2026/9/14 21:40:34

分布式卡尔曼滤波算法比较与实现解析

1. 项目概述在分布式系统中,状态估计是一个核心问题。离散时间线性系统的分布式滤波器设计,特别是基于共识的算法,近年来受到广泛关注。这类系统在无人机编队、传感器网络、智能电网等领域有着重要应用。我最近在实际项目中测试了六种主流滤波…

2026/9/14 21:40:34

MATLAB多无人机协同路径规划算法与实现

1. 项目背景与核心挑战城市空中交通(UAM)作为未来智慧城市的重要组成部分,正面临多无人机协同作业的关键技术突破需求。与传统单无人机路径规划不同,多无人机系统需要解决三大核心难题:首先是动态避碰问题,在三维城市空间中需实时…

2026/9/14 21:40:34

电子制造业呆滞物料管理:流程优化与跨部门协作实践

1. 项目背景与核心价值 在电子组装和精密机械制造领域,呆滞物料管理一直是困扰企业的痛点问题。我们车间最近刚完成了一次呆滞料集中清理行动,整个过程涉及6个部门协同,最终清理了价值超过200万元的积压物料。这次经历让我深刻意识到&#xf…

2026/9/14 21:40:34

SpringBoot货物管理系统开发实践与优化

1. 项目概述:SpringBoot东燕手袋厂货物管理系统东燕手袋厂作为一家典型的中小型制造企业,每天需要处理大量原材料入库、半成品流转和成品出库的业务流程。传统的手工记账方式不仅效率低下,还容易出错。这套基于SpringBoot的货物管理系统正是为…

2026/9/14 21:35:34

OpenCowork实测:从function calling到可视化预览,Agent如何真正干活

很久没有遇到一个值得聊的 Agent 项目了,OpenCowork 算一个。去年开始我就一直在找"能真正把活干完"的工具,而不是又一个只能陪聊的模型包装壳子。OpenCowork 的设计思路很直白:你输入一个任务,它自己决定调用哪些工具&…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码