ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

鸿蒙应用开发之家庭应急物资检查页深度实践:@Builder 三区拆解与状态色编码映射机制

鸿蒙应用开发之家庭应急物资检查页深度实践:@Builder 三区拆解与状态色编码映射机制 鸿蒙应用开发之家庭应急物资检查页深度实践Builder 三区拆解与状态色编码映射机制文章目录鸿蒙应用开发之家庭应急物资检查页深度实践Builder 三区拆解与状态色编码映射机制1、引言2、效果展示与页面结构3、Header单行品牌头的标准范式4、SummaryCard三列告警渐变卡5、CheckList状态色编码与去补充列表6、跨页数据自洽物资检查的全局闭环7、多维度方案选型对比检查处理页的三种形态8、避坑指南检查页的四个防翻车细节9、常见问题 FAQ10、总结1、引言场景是这样的我们团队最近在开发一款面向家庭用户的应急物资管理应用。产品经理提出了一个极其刚性的诉求——当用户打开物资检查页面时不仅要一眼看到哪些物资出了问题的汇总数据已过期几件、即将过期几件、库存不足几件还需要在同一个屏幕上逐条列出每件问题物资的明细并给出去补充的处理入口。在传统的移动端开发中这种告警总览 处理列表的组合布局往往需要用 Fragment 嵌套 RecyclerView或者用多个自定义 View 拼装。状态色编码红色已过期、橙色即将过期、橙色库存不足散落在 Adapter 的 ViewHolder 里维护起来极其痛苦——改一个颜色要翻三个文件。幸运的是在 HarmonyOS 的 ArkUI 声明式开发范式中Builder装饰器给了我们一种极其优雅的方案将页面拆分为三个独立的构建块Header、SummaryCard、CheckList每个块内部用ForEach驱动数据渲染状态色通过数据模型的color字段动态注入整页代码不到 100 行。这篇实战手记我们将从emergency-kit/entry/src/main/ets/pages/Func2Tab.ets共 97 行切入不仅教你如何用Builder拆解检查页的三区结构更重要的是借此机会彻底拆解状态色编码在图标底、问题文字、类型标签三处的贯穿设计以及告警卡计数与列表条数的数据自洽闭环。我们不背文档不讲空话直接看真实场景下的解法。2、效果展示与页面结构在正式深入代码之前我们先看看最终的页面表现和工程底座。直观的视觉冲击能让你瞬间明白我们在解决什么问题。检查页是告警总览 处理列表的组合布局整体由 3 个Builder块构成build() { Column() { this.Header() Scroll() { Column({ space: 14 }) { this.SummaryCard() this.SectionTitle(需要处理) this.CheckList() } .width(100%) .padding({ left: D.pad, right: D.pad, top: 14, bottom: D.pad this.safeBottom 20 }) } .layoutWeight(1).scrollBar(BarState.Off).align(Alignment.Top) } .width(100%).height(100%).backgroundColor(C.bg) }这个结构的设计初衷是明确划分总览和处理的职责边界Header— 单行品牌头“物资检查”白底固定20 号加粗点明本页职能SummaryCard— 橙棕渐变三列告警卡已过期 / 即将过期 / 库存不足24 号加粗白字CheckList— 需要处理标题 4 条检查列表每条含状态色图标、问题文字、去补充按钮检查页回答的核心问题是哪些物资有问题、怎么处理——告警卡给结论1 过期 / 1 临期 / 2 不足列表给明细4 条问题 去补充按钮一页完成发现问题 → 处理问题的闭环。3、Header单行品牌头的标准范式Header() { Row() { Text(物资检查).fontSize(20).fontWeight(FontWeight.Bold).fontColor(C.text) } .width(100%).height(this.safeTop 56).padding({ top: this.safeTop, left: D.pad, right: D.pad }) .backgroundColor(C.card).alignItems(VerticalAlign.Bottom) }功能页 Header 的标准范式20 号字号、固定高度安全区 56vp、文字贴底对齐。与物资页、我的页同款——品牌一致性是系列应用的基本素养。这里有一个极其关键的细节height(this.safeTop 56)将状态栏安全区纳入 Header 高度padding({ top: this.safeTop })把文字推到安全区之下。如果不做这层处理在刘海屏设备上物资检查四个字会被状态栏遮挡——这是鸿蒙开发中最容易忽略的适配坑之一。4、SummaryCard三列告警渐变卡SummaryCard() { Row() { Column({ space: 4 }) { Text(1).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#FFFFFF) Text(已过期).fontSize(12).fontColor(#FFFFFF).opacity(0.9) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Column({ space: 4 }) { Text(1).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#FFFFFF) Text(即将过期).fontSize(12).fontColor(#FFFFFF).opacity(0.9) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Column({ space: 4 }) { Text(2).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#FFFFFF) Text(库存不足).fontSize(12).fontColor(#FFFFFF).opacity(0.9) }.alignItems(HorizontalAlign.Start).layoutWeight(1) } .width(100%).padding(20).borderRadius(D.rLg) .linearGradient({ angle: 135, colors: [[C.primary, 0.0], [C.accent, 1.0]] }) }技术拆解第一橙棕渐变的品牌统一。linearGradient({ angle: 135, colors: [[C.primary, 0.0], [C.accent, 1.0]] })——从#D35400渐变到#E88050135 度对角线方向。这与首页准备度卡同款渐变告警卡不是独立组件而是品牌视觉体系的一环。用户看到橙棕渐变就联想到应急物资这是色彩品牌化的设计目标。第二三列均分的布局策略。Row 三个layoutWeight(1)Column 实现 1:1:1 等分。每列结构完全一致24 号 Bold 白字数值 12 号 90% 透明度白字标签。数值大、标签小的字号对比让用户扫一眼就能抓到关键数字1/1/2而不需要逐列阅读。第三三态告警的分类逻辑。三类问题已过期 / 即将过期 / 库存不足各占一列——这与 App 58 首页的三态正常 / 临期 / 超期不同本页三列是三类问题数量的聚合统计按问题类型而非物资状态分列。已过期是效期维度库存不足是数量维度两个维度的问题聚合在同一张卡上因为对用户而言它们都是需要处理的物资问题。第四数据自洽的计数对账。1 1 2 4 条恰好等于下方需要处理列表的 4 条——告警卡计数 列表条数。已过期 1 条感冒药、即将过期 1 条午餐肉、库存不足 2 条罐头 急救包。这个对账关系不是巧合而是数据模型的设计约束告警卡从同一份items数组统计列表从同一份数组渲染同源数据保证计数永远一致。5、CheckList状态色编码与去补充列表CheckList() { Column({ space: 10 }) { ForEach(this.items, (it: CheckItem) { Row({ space: 12 }) { Row() { Text(it.emoji).fontSize(24) } .width(48).height(48).backgroundColor(it.color 22).borderRadius(D.rSm).justifyContent(FlexAlign.Center) Column({ space: 4 }) { Text(it.name).fontSize(14).fontWeight(FontWeight.Medium).fontColor(C.text) Text(it.issue).fontSize(12).fontColor(it.color) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Text(去补充).fontSize(11).fontColor(#FFFFFF) .padding({ left: 12, right: 12, top: 6, bottom: 6 }).backgroundColor(C.primary).borderRadius(D.rSm) .onClick(() { promptAction.showToast({ message: 采购 it.name }); }) } .width(100%).padding(12).backgroundColor(C.card).borderRadius(D.rMd).border({ width: 1, color: C.stroke }) }, (it: CheckItem) it.id.toString()) }.width(100%) }4 条检查数据21-26 行物资问题类型颜色 午餐肉罐头将于 2026-09 过期即将过期橙 感冒药已于 2026-07 过期已过期红 罐头食品库存仅剩 6 件库存不足橙 医药急救包库存仅剩 1 个库存不足橙这段代码中有几处极其精妙的设计是我们在多次迭代后沉淀出来的第一状态色透明底图标的颜色编码。backgroundColor(it.color 22)——将状态色十六进制值拼接2213% 透明度作为图标容器背景。过期物资的图标底是红色透明#FF5A6E22不足物资的图标底是橙色透明#FF9F1C22。图标底随问题类型变色而非统一用主题色——这是检查页与首页的关键差异。首页的图标底用主题色软底品牌统一检查页的图标底用问题色问题导向强化这条有问题的视觉信号。第二问题文字的状态色注入。Text(it.issue).fontSize(12).fontColor(it.color)——问题描述文字直接使用状态色。将于 2026-09 过期显示为橙色已于 2026-07 过期显示为红色。文字颜色编码问题严重度红色 已不能使用最紧急橙色 快到期限或快用完次紧急。用户扫列表时红色文字最先被注意优先处理。第三去补充按钮的行动导向。右侧橙色实心小按钮C.primary底 白字 圆角 padding 12×6点击弹 Toast采购 午餐肉罐头。这是检查页的核心交互——不只是发现问题还给出动作。过期物资去补充是买新的旧的丢弃不足物资去补充是补数量6 → 12即将过期物资去补充是提前补新货。三类问题的处理动作统一收敛为去补充一个入口减少操作路径。第四状态色在三处的贯穿编码。同一状态色出现在三个位置图标底状态色 13% 透明、问题文字状态色实色、类型标签即将过期 / 已过期 / 库存不足。三处同色系强化这条有问题的认知——图标底给全局色感、文字给具体问题、标签给分类归属同一颜色编码三处呈现用户扫一眼就能判断哪类问题、多严重。6、跨页数据自洽物资检查的全局闭环检查页不是孤岛——它与首页、物资页、我的页形成四页数据闭环检查页1 已过期感冒药↔ 我的页过期提醒开关——感冒药已于 2026-07 过期触发我的页过期提醒推送开关开启时过期检查 → 过期提醒。检查页午餐肉 2026-09 即将过期↔ 物资页罐头——午餐肉罐头是物资页食品饮水分类下的物品保质期临近库存管理 → 效期检查。检查页罐头食品 库存仅剩 6 件↔ 首页罐头食品 偏少 6 件、物资页罐头 6——数量完全一致6 件首页标偏少、检查页标库存不足更紧急、物资页可 补货三页同一库存状态机。检查页医药急救包 库存仅剩 1 个↔ 首页医药急救包 偏少 1 件——数量一致1 件急救包是最关键应急物资伤病急救库存不足最需优先处理。检查页2 库存不足↔ 首页2 项物资需要补充——数量一致2 项首页准备度卡的待补量 检查页库存不足数首页缺口 → 检查页处理。这套闭环的核心是统一数据源——四页共享同一份物资数据模型首页做准备度总览、物资页做库存管理、检查页做问题处理、我的页做提醒配置各司其职但数据同源。改一处库存四页同步刷新。7、多维度方案选型对比检查处理页的三种形态在实际的架构研讨中有同学曾经发出过极其尖锐的质疑“检查页为什么不直接用首页的’偏少列表’为什么要单独做一个检查页”为了彻底解答这个选型问题我们将系列中检查 / 处理型页面对比维度App 60 检查页App 58 日志页App 53 保修页App 56 费用页核心定位问题处理历史沉淀信息查询数据统计顶部卡片三列告警渐变卡统计卡保修卡月度卡 柱状图列表内容4 条问题 去补充按钮时间轴记录售后电话费用明细处理动作有去补充无有呼叫无状态色编码红 / 橙三态无无无60 的差异化在于**“去补充处理按钮**——检查列表每条带橙色去补充按钮是检查 → 处理的行动闭环。其他检查 / 统计页多为只读展示日志页看历史、费用页看数据而检查页不只是发现问题”告警卡还给出动作去补充按钮。过期与不足都通过去补充解决补新 / 补量发现问题 → 立即处理的行动导向是应急场景的核心——物资问题不能拖。8、避坑指南检查页的四个防翻车细节在将这套看起来优雅的检查页设计推向真实生产环境时我们踩过了几个深浅不一的暗坑。以下是内部复盘后沉淀的防翻车铁律第一过期判定必须动态化。“将于 2026-09 过期 / 已于 2026-07 过期在演示中是写死文案——产品化必须由当前日期 vs 有效期动态判定。30 天内过期 即将过期、已过有效期 已过期。日期推进后状态自动变化2026-09 到了午餐肉从即将过期变已过期”检查列表实时刷新。如果写死文案应用上线一个月后所有即将过期都变成了已过期但界面不更新用户会完全失去信任。第二库存不足判定与首页联动。库存不足罐头 6 / 急救包 1与首页偏少是同一库存——产品化必须统一状态机。建议阈值库存 ≤ 建议量 50% 标偏少首页、≤ 20% 标库存不足检查页。物资页加减后首页与检查页同步刷新避免首页偏少、检查页不足阈值不一致导致用户困惑。第三去补充的动作闭环。去补充只弹 Toast 是演示级别——产品化必须接入采购流程。点击去补充跳采购页 / 加购物清单 / 记录采购采购后库存更新罐头 6 → 12、检查列表移除该条、首页状态刷新偏少 → 充足。去补充 → 采购 → 库存更新 → 问题解决的完整闭环否则用户点了按钮但问题没解决检查页就成了只报问题不解决问题的摆设。第四图标底的问题色辨识度。it.color 22状态色透明底在浅色 emoji 上对比清晰但若物资图标是深色 emoji 手电叠加红色底辨识度可能下降。产品化可加状态圆点或问题文字加粗辅助确保状态色在任何图标上都可辨识。另外检查列表的排序应按紧急度——已过期红置顶 即将过期橙 库存不足橙让最紧急的问题排在最上用户打开检查页先看到红色已过期项优先处理。9、常见问题 FAQ问检查页的 4 条问题是从哪来的答演示数据设定 4 条待处理——午餐肉即将过期2026-09、感冒药已过期2026-07、罐头食品库存不足6 件、医药急救包库存不足1 件分别对应三类告警即将过期 1、已过期 1、库存不足 2。产品化后由物资数据动态生成遍历所有物资判断效期与库存生成检查项新增物资 / 库存变化后自动更新。问为什么感冒药已过期是红色而库存不足是橙色答紧急度分级——已过期感冒药 2026-07是现在已经不能用了最紧急红色 danger即将过期午餐肉 2026-09与库存不足罐头 / 急救包是快到了但还有时间橙色 warn。红色 橙色的紧急度编码与 App 53/55 的超期红 / 临期橙语义一致用户扫列表时红色已过期最先被注意、优先处理。问去补充对已过期和库存不足的处理一样吗答动作一样都是去补充按钮、内容不同——已过期的感冒药去补充是买新药旧的丢弃库存不足的罐头去补充是补数量6 → 12即将过期的午餐肉去补充是提前补新旧的尽快吃。统一用去补充入口产品化后区分丢弃 补充流程处理动作收敛为一个按钮减少操作路径。问已过期和即将过期有什么区别答时间维度不同——已过期感冒药 2026-07 已过是现在已经不能用了过期药必须丢弃最紧急即将过期午餐肉 2026-09 快过是还没过期但快到了可尽快食用或提前补充稍缓。告警卡两列分开计数1 已过期 / 1 即将过期列表用红已过期/ 橙即将过期区分紧急度红色优先处理。10、总结纵观本篇对 emergency-kit 检查页Func2Tab97 行的逐块拆解Builder复用范式绝对不是大家在走马观花浏览 ArkUI 文档时所以为的仅仅只是把代码拆成几个函数那么简单。检查页用三个Builder块完成了告警总览 处理列表的组合布局Header 点明职能、SummaryCard 给出问题汇总1 已过期 / 1 即将过期 / 2 库存不足、CheckList 给出明细与动作4 条问题 去补充按钮。整页的视觉语言围绕状态色 行动展开——红橙状态色编码紧急度、状态色透明图标底强化问题感、去补充橙色按钮突出行动用户一页完成发现问题 → 处理问题的闭环。从演示到产品检查页的进化方向清晰定期巡检每月自动推送巡检结果、分级处理按紧急度排序 分级提醒、采购清单联动一键加入购物清单、物资健康报告月度健康报告。状态色编码与去补充按钮是本页的核心让应急物资的维护问题可见、动作可达。
返回列表