当前位置: 首页 > news >正文

弹窗库:Toast、Loading、ActionSheet的统一封装(244)

在鸿蒙(HarmonyOS)应用开发中,系统自带的AlertDialog往往样式单一,而频繁手写CustomDialog又会导致代码冗余。为了实现 Toast、Loading、ActionSheet 的统一封装,目前业界主要有两种主流方案:引入成熟的第三方库基于原生 API 进行高阶自定义封装

方案一:引入成熟的第三方库(推荐,开箱即用)

鸿蒙生态中已有非常优秀的零侵入弹窗库,例如@pura/harmony-dialog。它仅需一行代码即可实现各种弹窗,极大提升了开发效率。

1. 安装与全局初始化

ohpm install @pura/harmony-dialog

必须在EntryAbilityonCreate生命周期中初始化上下文,否则调用会报错:

import { DialogUtil } from '@pura/harmony-dialog'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.UIAbilityLaunchParam): void { DialogUtil.init(this.context); } }

2. 统一调用示例

import { DialogUtil } from '@pura/harmony-dialog'; // 1. Toast 轻量提示 DialogUtil.toast('操作成功'); // 2. Loading 加载状态(网络请求时使用) DialogUtil.loading('加载中...'); // 请求结束后关闭 DialogUtil.hideLoading(); // 3. ActionSheet 底部菜单 DialogUtil.actionSheet(['拍照', '从相册选择'], (index: number) => { console.log('选择了第', index, '项'); });

注:该库还支持弹窗队列,多个弹窗依次显示不会互相覆盖,非常适合批量提示场景。


方案二:基于原生 API 的高阶自定义封装

如果项目对 UI 样式有极高的定制要求,或者不希望引入第三方依赖,可以基于鸿蒙最新的UIContext.getPromptAction.openCustomDialog进行全局解耦封装。

核心设计思路:

  1. 页面解耦:使用openCustomDialog代替传统的CustomDialogController,实现全局任意位置调用,无需在页面中绑定组件。
  2. 状态双向绑定:使用$$语法进行布尔值绑定,确保弹窗能正确关闭。
  3. 单例模式:封装一个DialogService统一调度。

1. 封装全局 Toast(利用 setTimeout 自动关闭)

@Builder function buildToast(params: { text: string }) { Text(params.text) .fontSize(16) .fontColor(Color.White) .padding(12) .backgroundColor('#CC000000') .borderRadius(8) } export class DialogService { static showToast(text: string, duration: number = 2000) { const uiContext = AppStorage.get<UIContext>('uiContext')!; const dialog = uiContext.getPromptAction().openCustomDialog( wrapBuilder(buildToast), { data: { text: text } } ); // 定时自动关闭 setTimeout(() => { dialog.close(); }, duration); } }

2. 封装通用 Loading 与 ActionSheet
同样地,将 Loading 的转圈动画(如LoadingProgress)和 ActionSheet 的列表布局封装为@Builder,通过openCustomDialog唤起。对于 Loading,可以通过暴露一个close()方法供业务层在异步请求结束后手动关闭。


鸿蒙弹窗选型决策树

在统一封装时,建议根据业务场景自动匹配最合适的底层 API:

  • 纯反馈提示(如保存成功):使用Toast
  • 二次确认(如删除操作):使用showDialogAlertDialog
  • 底部选项/动作面板:使用ActionSheetbindSheet
  • 自定义复杂 UI 弹窗:使用openCustomDialog
  • 全屏遮罩/半模态:使用bindContentCoverbindSheet
http://www.cnnetsun.cn/news/3609247.html

相关文章:

  • C 语言 struct 内存对齐与面向对象:从 padding 到函数指针接口
  • 从“刷卡拥堵”到“秒级通行”:一张RFID电子校徽如何让校园管理有迹可循?
  • 2023三大开源AI工具实战:Dify、n8n与OpenClaw
  • 东莞商旅服务平台头部机构多维度能力梳理及选型参考
  • LLM Agent技术演进:从定制化到通用化
  • 解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
  • LLM到Agent的技术演进与核心组件解析
  • Windows11的SMB共享文件夹
  • 英文降AI率实战:Turnitin更新后,文本AI率优化策略(附3款工具测评)
  • 上海宝山高境开公司的老板注意!低价代账正在拖垮你的企业
  • 从 50 字段订单表到可演进订单领域:一次基于真实代码的 DDD 重构分析
  • VS Code远程开发——现代机器人开发的主流IDE方案
  • Python agate-stats 包详解:功能、安装、语法与实战案例
  • Python agate-lookup 包详解:功能、安装、语法与实战案例
  • 2026 主流热门 AI 配音软件合集深度实测测评报告
  • 全球80000余座大型国际机场、地区性通航机场、水上飞机起降点分布矢量数据
  • 深入解析TMS320C5x DSP架构:哈佛结构、外设协同与低功耗设计实战
  • 终于不用熬夜写论文了[特殊字符]|PaperXie一套搞定本科毕业论文全流程
  • 选单片机硬件设计公司,怎么避坑不踩雷?
  • ESXi嵌套虚拟化Windows卡顿完整解决方案:GPU直通优化与嵌套底层开销说明
  • 【课程设计/毕业设计】基于 Django 的智慧小区动态监测与可视化分析系统 新型智慧社区综合治理服务平台【附源码、数据库、万字文档】
  • 银行卡二 / 三 / 四要素核验 API:原理、差异与业务选型指南
  • 手板模型供应商如何选?
  • Z-Image-Turbo-Anime轻量化AI动漫生成模型解析
  • 改进蚁群算法在MATLAB中的多无人载具路径规划实践
  • 企业级 Java 项目接入大模型的 6 个安全陷阱:我们如何用飞算 Java AI 堵住漏洞?
  • 【2019-12-25】【转】使用All in One WP Migration插件为WordPress快速搬家
  • 【IEEE、浙江理工大学、南京信息工程大学联合主办 | IEEE出版 | 连续多届稳定EI检索 | 大咖组委嘉宾阵容 | 设评优评选】第十二届能源材料与电力工程国际学术会议 (ICEMEE 2026)
  • HiPRAG:智能代理框架中的选择性检索增强生成技术
  • C2000 FSI偏斜补偿:高速串行通信时序校准实战指南