news 2026/7/16 2:18:51

鸿蒙应用开发实战【22】— 空状态引导页设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙应用开发实战【22】— 空状态引导页设计与实现

鸿蒙应用开发实战【22】— 空状态引导页设计与实现

前言

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

用户首次打开号码助手时,数据库是空的——没有卡号、没有应用绑定记录。这时候如果直接展示一个空白列表,用户会感到困惑。一个好的 App 应该在空状态时展示友好的引导信息,告诉用户「这里还没有内容,接下来你可以这样做」。这就是 EmptyState 组件的价值。

本篇涵盖:EmptyState @Builder 组件设计、Blank() 弹性布局实现垂直居中、多场景空状态(列表为空/搜索无结果/筛选无匹配/导入为空)、条件渲染展示空状态、引导按钮点击导航。


图1:EmptyState 组件结构 + Blank 弹性布局 + 多场景空状态 + 条件渲染


一、EmptyState 组件设计

1.1 组件结构

// 通用的空状态组件@BuilderprivateEmptyState(icon:string,title:string,desc:string,btnText:string,btnAction:()=>void){Column(){// ① 大图标(Emoji / 自定义图标)Text(icon).fontSize(48).margin({bottom:16})// ② 标题(主要说明)Text(title).fontSize(18).fontWeight(AppFonts.WEIGHT_BOLD).fontColor(AppColors.TEXT).margin({bottom:8})// ③ 描述文案(详细说明)Text(desc).fontSize(12).fontColor(AppColors.TEXT_2).textAlign(TextAlign.Center).margin({bottom:20})// ④ 引导按钮(操作入口)Button(btnText,{type:ButtonType.Normal}).fontSize(12).fontColor('#FFFFFF').backgroundColor(AppColors.PRIMARY).borderRadius(18).height(36).width(140).onClick(()=>btnAction())}.alignItems(HorizontalAlign.Center).width('100%')}

1.2 组件层级

层级组件说明
Text(icon)大号 Emoji 图标,视觉吸引注意
Text(title)核心状态说明,粗体醒目
Text(desc)辅助引导文案
Button(btnText)CTA 按钮,点击后引导用户操作

二、Blank() 弹性布局实现垂直居中

2.1 为什么需要 Blank

空状态页面需要在屏幕中间展示,但页面上方有 TitleBar、下方有 TabBar。直接设置justifyContent(FlexAlign.Center)会让内容整体居中,但如果内容偏少可能会偏上或偏下。使用Blank()可以弹性撑开,将 EmptyState 推到视觉中心。

// 空状态页面结构Column(){// ① 标题栏(固定高度)TitleBar()// ② 弹性撑开区域Blank()// ③ 空状态内容(居中显示)this.EmptyState('📭','暂无绑定记录','你还没有添加任何应用绑定\n点击下方按钮开始添加','+ 添加应用',()=>this.navigateToAddPage())// ④ 弹性撑开区域Blank()// ⑤ 底部 TabBar(固定高度)TabBar()}.height('100%')

2.2 Blank() 的弹性原理

Blank()是一个不可见的弹性组件,会自动占据 Column 中的剩余空间。两个Blank()会把中间的 EmptyState 推到 Column 的垂直中心。

对比实现方式效果
justifyContent: Center只居中子元素内容可能偏上(TabBar 占位)
Blank() 双边撑开上下 Balance严格视觉居中

2.3 结合三态 UI

// 在实际页面中,空状态是三态 UI 的"正常内容"的一部分if(this.loading){this.LoadingState()}elseif(this.loadError){this.ErrorState(this.loadError)}elseif(this.rows.length===0){this.EmptyStatePage()// ← 这里使用 Blank + EmptyState}else{this.ContentPage()// ← 正常列表}

三、多场景空状态

不同的场景需要不同的空状态文案和图标:

3.1 场景定义

// 各个页面调用 EmptyState 的场景// 首页 — 没有绑定记录this.EmptyState('📭','暂无绑定记录','你还没有添加任何应用绑定\n点击下方按钮开始添加','+ 添加应用',()=>{this.navigate('pages/AddAppPage')})// 卡号管理 — 没有卡号this.EmptyState('💳','暂无卡号','点击右上角「+」添加你的第一张卡号','',()=>{})// 不需要按钮,右上角有 +// 搜索页 — 搜索无结果this.EmptyState('🔍','未找到匹配结果','尝试修改搜索关键词或筛选条件','',()=>{})// 粘贴导入 — 未识别到应用this.EmptyState('📎','未识别到应用信息','请确认粘贴内容包含应用名称和卡号','重新粘贴',()=>{this.pastedText=''})

3.2 场景矩阵

场景图标标题引导操作
绑定记录为空📭暂无绑定记录+ 添加应用
卡号列表为空💳暂无卡号右上角 +
搜索无结果🔍未找到匹配结果无(仅在搜索框输入)
粘贴导入为空📎未识别到应用信息重新粘贴
筛选无匹配当前筛选无结果重置筛选

四、引导按钮导航

4.1 导航封装

// 页面内部的导航方法privatenavigateToAddPage():void{router.pushUrl({url:'pages/AddAppPage',params:{}asRecord<string,Object>})}

4.2 关闭弹窗后导航

有时候空状态出现在弹窗或面板中,需要先关闭再导航:

privatehandleAction():void{if(this.isInSheet){this.showSheet=false// 先关闭面板}// 延迟导航,给关闭动画留时间setTimeout(()=>{this.navigateToAddPage()},300)}

五、本篇小结

知识点核心要点
EmptyState @Builder参数化:icon/title/desc/btnText/btnAction
Blank() 弹性布局两个 Blank() 将内容推到垂直居中
多场景复用搜索/列表/导入/筛选各自定制文案
条件渲染if/else 判断数据长度为 0 时展示空状态
引导按钮点击导航到添加页面,考虑弹窗延迟

参考资料

  • 鸿蒙应用开发实战【23】— 三态 UI
  • 鸿蒙应用开发实战【05】— 首页开发与状态管理
  • Blank 组件 API
  • @Builder 装饰器
  • Column 容器

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • 开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
  • Blank 组件文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-blank
  • Column 容器文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-column
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 2:17:51

终极指南:使用Akagi AI助手提升雀魂麻将竞技水平

终极指南&#xff1a;使用Akagi AI助手提升雀魂麻将竞技水平 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將&#xff0c;能夠使用自定義的AI模型實時分析對局並給出建議&#xff0c;內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki, …

作者头像 李华
网站建设 2026/7/16 2:17:37

github一周涨11k⭐️!25GB 内存跑 744B GLM-5.2 模型!

大家好这里是AIWritePaper官方账号~ 如果一台机器没有高端 GPU&#xff0c;只有约 25GB 可用内存&#xff0c;它能运行 7440 亿参数的大模型吗&#xff1f; 按照常规部署思路&#xff0c;答案几乎一定是否定的。开源项目 Colibr 换了一个切入点&#xff1a;它利用混合专家模型&…

作者头像 李华
网站建设 2026/7/16 2:16:12

解构RISC-V指令集(一)

1. RISC-V指令集的前世今生我第一次接触RISC-V是在2018年&#xff0c;当时正在为一个物联网项目选型处理器架构。传统ARM架构的授权费用让初创团队望而却步&#xff0c;而x86的功耗又难以满足需求。就在这个时候&#xff0c;同事推荐了这款"处理器界的Linux"——RISC…

作者头像 李华
网站建设 2026/7/16 2:15:31

基于C++与Live555构建高性能RTSP流媒体服务器实战指南

1. 项目概述&#xff1a;为什么选择C和Live555来构建RTSP服务器&#xff1f; 如果你正在处理音视频流媒体相关的项目&#xff0c;比如安防监控、在线教育、视频会议&#xff0c;或者只是想自己搭建一个能推送视频流的服务端&#xff0c;那么“RTSP服务器”这个概念你肯定绕不开…

作者头像 李华
网站建设 2026/7/16 2:14:18

AIAgent多租户架构下的隔离挑战与OpenTelemetry可观测性实践

1. 项目概述&#xff1a;AIAgent架构中的多租户隔离挑战最近在设计和评审几个大型AIAgent平台项目时&#xff0c;我发现一个普遍被低估的架构风险&#xff1a;多租户隔离。很多团队在初期快速迭代时&#xff0c;往往把精力都放在了Prompt工程、模型调用和前端交互上&#xff0c…

作者头像 李华
网站建设 2026/7/16 2:14:05

基于PLC的火灾自动报警灭火控制系统设计12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于PLC的火灾自动报警灭火控制系统设计12(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_ 现 成的word文档一篇&#xff0c;售价便宜&#xff0c;感兴趣的直接下单购买&#xff0c;标价就是卖价。说明书word文档,无程序文件 备注:如果介绍的图…

作者头像 李华