HarmonyOS应用实战-启示散页-66-空题库别只禁用按钮:给当前选择和抽取入口一条恢复链 HarmonyOS 应用实战 66空题库别只禁用按钮给当前选择和抽取入口一条恢复链“获取答案”按钮变灰只能阻止当前点击不能解释当前题库为什么不可用。空题库、被删除的题库、答案全被清空的题库都需要一条恢复链告诉用户当前状态、给出可操作入口并保证抽取服务不会拿空数组随机。本文解决四个问题区分无题库、空题库、当前题库失效在服务层返回可恢复状态页面展示恢复入口而不只禁用按钮验证首页、选择器、抽取页三处一致空题库不是一个按钮状态按钮禁用只是 UI 结果背后可能是三类业务状态没有任何题库、当前题库不存在、当前题库存在但没有答案。它们对应的恢复动作不同。| 状态 | 用户应看到什么 | |---|---| | noDeck | 创建或导入题库入口 | | missingCurrent | 回退默认题库或重新选择 | | emptyAnswers | 去编辑题库添加答案 |空题库不是一个 UI 状态而是一组需要恢复的业务状态。没有题库、当前题库失效、题库存在但答案为空分别需要不同入口。HomeReadyState 描述恢复动作首页快照应明确是否可抽取以及不可抽取时该给哪个恢复动作。typeRecoveryActioncreateDeck|selectDeck|editCurrentDeck|fallbackDefault;interfaceHomeReadyState{drawable:boolean;currentDeckId:string;reason?:string;recoveryAction?:RecoveryAction;}HomeReadyState把是否可抽取和恢复动作放在同一个快照里页面就不用在按钮、空态和选择器之间各自判断。HomeService 负责判断题库状态页面不遍历 decks 判断原因。服务读取当前 id 和题库列表后返回可展示状态。classHomeReadinessService{asyncload():PromiseHomeReadyState{constdecksawaitDeckRepository.loadAllDecks();if(decks.length0){return{drawable:false,currentDeckId:,reason:还没有题库,recoveryAction:createDeck};}constcurrentIdawaitAppPreferencesRepository.loadCurrentDeckId();constcurrentdecks.find((deck)deck.idcurrentId);if(!current){return{drawable:false,currentDeckId:DEFAULT_DECK_ID,reason:当前题库已失效,recoveryAction:fallbackDefault};}returncurrent.answers.length0?{drawable:true,currentDeckId:current.id}:{drawable:false,currentDeckId:current.id,reason:当前题库没有答案,recoveryAction:editCurrentDeck};}}首页服务负责读题库、校验当前选择并给出原因。这个判断放在页面里会让快捷入口和抽取页绕过同一条规则。抽取服务仍然要做最后防线首页显示可抽取不代表点击瞬间仍可抽取。AnswerPickService 必须拒绝空候选集。classAnswerPickService{pick(deck:Deck):Answer{if(deck.answers.length0){thrownewError(题库没有可抽取答案);}returndeck.answers[Math.floor(Math.random()*deck.answers.length)];}}抽取服务必须做最后防线。状态从首页展示到用户点击之间可能变化空数组随机不能靠按钮禁用来避免。页面恢复入口要指向具体动作不要只显示“暂无数据”。用户需要知道下一步是创建、选择、编辑还是回退。Componentstruct HomeRecoveryPanel{Propstate:HomeReadyState;privateprimaryAction():void{if(this.state.recoveryActioneditCurrentDeck){NavigationService.openDeckEdit(this.state.currentDeckId);}elseif(this.state.recoveryActionfallbackDefault){DeckService.setCurrent(DEFAULT_DECK_ID);}}}恢复入口要具体到动作创建、选择、编辑、回退。只显示“暂无数据”会让用户知道出错却不知道怎么恢复。空题库回归要覆盖入口差异从首页按钮、历史再次提问、快捷入口进入抽取都要得到同一个不可抽取原因。验证删除全部题库保留一个空题库删除当前题库从首页和快捷入口分别抽取确认都不会进入随机逻辑。入口差异是空题库回归的重点。首页按钮、历史再次提问、快捷推荐进入抽取都应该得到同一个不可抽取原因。空题库排查表如果只是按钮灰了说明恢复链还不完整。现象缺少什么修复只有按钮变灰没有 reason/action返回 HomeReadyState快捷入口仍崩溃只在首页判断抽取服务最后校验用户不知怎么办空态无主动作指向创建/编辑/回退排查时不要先调按钮样式。先确认服务返回的reason和recoveryAction是否完整再看页面是否正确消费。恢复链要写到用户能继续操作空题库文章要避免停在“禁用按钮”。真正的恢复链至少有状态解释、主动作和兜底动作。比如没有题库时主动作是创建或导入当前题库为空时主动作是编辑当前题库失效时主动作是重新选择或回退默认。状态主动作兜底noDeck创建题库导入演示题库missingCurrent重新选择回退默认题库emptyAnswers编辑当前题库切换其他题库这个表能直接指导 UI而不是只指导 Service。服务和页面各验一次服务层验证看返回的HomeReadyState页面层验证看用户是否有可点击恢复入口。两层只验一层都会漏问题服务正确但页面没入口用户仍然卡住页面有入口但服务最后不拦截快捷路径仍可能崩。服务样本noDeck / missingCurrent / emptyAnswers / ready 页面样本首页按钮 / 快捷推荐 / 历史再次提问 / 冷启动恢复 通过标准每个不可抽取状态都有 reason 和 recoveryAction抽取服务拒绝空候选集。要特别检查历史再次提问和快捷推荐因为它们最容易绕过首页按钮状态。发布前不要让空态截图变成假证据空态截图只能证明页面有提示不能证明抽取服务安全。交付记录要把截图和服务样本放在一起。材料证明范围仍需补充空态截图用户能看到恢复入口抽取服务是否拦截Service 返回样本状态判断正确页面是否正确消费冷启动记录当前选择恢复安全快捷入口是否一致这样写读者不会误以为“按钮灰了”就代表空题库链路已经闭合。恢复动作要能跨页面复用空题库恢复不能只服务首页。历史页的“再次提问”、结果页的“再抽一次”、快捷推荐卡片都可能进入同一条抽取链路。因此RecoveryAction最好能被多个入口复用而不是写成首页私有按钮逻辑。classRecoveryNavigator{statichandle(action:RecoveryAction,deckId:string):void{if(actioncreateDeck){NavigationService.openDeckCreate();}elseif(actioneditCurrentDeck){NavigationService.openDeckEdit(deckId);}elseif(actionselectDeck){NavigationService.openDeckSelector();}}}这个协调层不负责判断题库状态只负责把服务层给出的动作连接到页面。这样恢复策略仍在HomeReadinessService导航执行也不会散到每个按钮里。人工评审时看提示是否能变成动作空态文案如果只解释原因不提供动作用户还是会卡住。评审时不要只看文字是否友好而要点每个恢复按钮确认它能进入创建、导入、编辑或选择题库的真实页面。评审样本 noDeck - 点击创建题库 - 进入 DeckCreatePage missingCurrent - 点击重新选择 - 打开 DeckSelector emptyAnswers - 点击添加答案 - 进入 DeckEditPage 并定位到答案区 fallbackDefault - 点击继续 - currentDeckId 写回默认题库这组样本能区分“空态设计完成”和“恢复链完成”。前者只让页面好看后者才能让用户继续完成抽取任务。小结空题库要给恢复链而不是只禁用按钮。HomeService 返回可抽取状态和恢复动作页面展示具体入口抽取服务做最后防线这样各种入口都能安全处理空数据。

相关新闻

最新新闻

洛雪音乐音源终极配置指南:三步实现全网音乐自由

洛雪音乐音源终极配置指南:三步实现全网音乐自由

洛雪音乐音源终极配置指南:三步实现全网音乐自由 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 想要在洛雪音乐中畅听全网音乐却不知如何配置音源?音源配置是解锁洛雪音乐…

2026/8/1 20:10:36
Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南

Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南

Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南 【免费下载链接】Qwen-Image-Edit-Rapid-AIO 项目地址: https://ai.gitcode.com/hf_mirrors/Phr00t/Qwen-Image-Edit-Rapid-AIO Qwen-Image-Edit-Rapid-AIO是一个革命性的AI图像编辑工具包&…

2026/8/1 20:10:36
3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具

3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具

3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾经因为误操作而将系统镜像写入错误的…

2026/8/1 20:10:36
低空经济赋能,政策东风加持!全球双转子发动机产业现状与发展趋势解析

低空经济赋能,政策东风加持!全球双转子发动机产业现状与发展趋势解析

一、核心产品概述与行业经营数据双转子发动机是基于汪克尔结构研发的旋转式内燃机,核心由双转子组件、偏心轴、精密密封系统、进排气及电控燃油喷射系统构成,双转子错位布局的设计,可实现动力叠加输出,完美解决单转子发动机功率不…

2026/8/1 20:10:36
Frosted Glass Themes终极指南:从安装到自定义的完整教程

Frosted Glass Themes终极指南:从安装到自定义的完整教程

Frosted Glass Themes终极指南:从安装到自定义的完整教程 【免费下载链接】homeassistant-frosted-glass-themes ✨ Beautiful and modern Theme for Home Assistant 项目地址: https://gitcode.com/gh_mirrors/ho/homeassistant-frosted-glass-themes Fros…

2026/8/1 20:10:36
MATLAB数据导出CSV全攻略:从基础函数到海量数据处理

MATLAB数据导出CSV全攻略:从基础函数到海量数据处理

1. 从数据到文件:为什么CSV是MATLAB数据导出的首选在数据分析、仿真和科研的日常里,我们常常在MATLAB里完成核心计算,得到一堆宝贵的矩阵、表格或结构体。但故事往往不会在MATLAB的命令窗口里结束。你需要把结果交给同事、导入到数据库、用其…

2026/8/1 20:05:35