全局弹窗相对于自定义弹窗有以下优点:

  • 封装更彻底,一行代码就能调用
  • 跟组件耦合度低,只需要传入组件的UIContext对象,不需要跟自定义弹窗一样需要在组件内部实例化CustomDialogController对象

全局弹窗是鸿蒙在API 12增加的,PromptAction对象增加了openCustomDialog方法。

代码实现

首先创建一个接口,用于参数的传递,弹窗内按钮的点击

interface GlobalDialogParam {
content:string; //弹窗显示内容
onConfirm: () => void //确认按钮的回调函数
onCancel: () => void// 取消按钮的回调函数
}

自定义弹窗内容,使用@Builder装饰器表明该函数将返回一个 UI 组件树,弹窗内容根据您的需求自己实现。本例中就显示一个简单的对话框。

@Builder function buildGlobalDialogComponent(param: GlobalDialogParam){
Column() {
Text(param.content).fontSize(17).fontColor("#181818")
.lineHeight(24).margin({
bottom:29,top:29,left:31,right:31
}) Divider().color("#D8D8D8").height(0.5)
RowSplit() {
Text("取消").fontSize(17).fontColor("#181818")
.fontWeight(FontWeight.Bold).onClick(event=>{
param.onCancel();
}).textAlign(TextAlign.Center).padding({
top:15,bottom:15
}).width('50%') Text("确定").fontSize(17).fontColor($r('app.color.mainColor'))
.fontWeight(FontWeight.Bold).onClick(event=>{
param.onConfirm();
}).textAlign(TextAlign.Center).padding({
top:15,bottom:15
}).width('50%')
}
}.backgroundColor($r('app.color.white')).width('80%').borderRadius(12)
}

在GlobalDialog类中增加两个静态方法,用来显示弹窗跟关闭弹窗,关键代码都增加来注释,这里就不过多解释了

export class GlobalDialog {
static contentNode:ComponentContent<GlobalDialogParam>; //显示弹窗
static show(context: UIContext,dialogParam: GlobalDialogParam){
//ComponentContent对象有三个参数
//参数1:UI 上下文
//参数2:使用 wrapBuilder 包装 buildGlobalDialogComponent 函数,这个函数用于构建对话框的实际内容
//参数3:传递给对话框的参数,包含内容文本和按钮的回调函数
GlobalDialog.contentNode = new ComponentContent(context, wrapBuilder(buildGlobalDialogComponent), dialogParam); const promptAction = context.getPromptAction()//通过 context 获取 promptAction,用于操作对话框显示 //显示弹窗
promptAction.openCustomDialog(GlobalDialog.contentNode,{
alignment: DialogAlignment.Center,//对话框在屏幕中央显示
autoCancel: false,//点击弹窗外区域是否取消弹窗
});
} //关闭弹窗
static close(context: UIContext){
const promptAction = context.getPromptAction()
promptAction.closeCustomDialog(GlobalDialog.contentNode)
}
}

通过以上三个步骤,全局弹窗的代码就封装好了,接下来在组件中如何调用呢?其实代码很简单,调用GlobalDialog.show方法显示弹窗,在确定跟取消按钮的回调函数中调用GlobalDialog.close取消弹窗。

GlobalDialog.show(this.getUIContext(),{
content:"您确定要删除这条记录吗?",
onConfirm:()=>{
GlobalDialog.close(this.getUIContext())//关闭弹窗
AppUtil.showToast("确定按钮点击");
},
onCancel:()=>{
GlobalDialog.close(this.getUIContext())//关闭弹窗
AppUtil.showToast("取消按钮点击");
}
})

效果图:

延伸阅读,@Builder 装饰器

在鸿蒙的 ArkUI 开发中,@Builder 装饰器是一种用于简化组件构建的标记,它通常用于函数上,指示该函数返回一个 UI 组件。

@Builder 装饰器的作用:

  1. 生成UI组件:@Builder 装饰器标记的函数主要用于构建 UI 组件。它将函数体内定义的 UI 布局和组件树返回给调用方,以便在应用程序中使用这些组件。
  2. 提高代码可读性和模块化: 通过使用 @Builder,可以把复杂的 UI 构建逻辑封装到一个函数中,使得代码更简洁和模块化,便于复用。例如,常见的对话框、弹窗、复杂组件可以通过这样的函数构建,并在不同的地方调用。
  3. 函数式UI构建: 鸿蒙的 ArkUI 是声明式 UI 框架,@Builder 提供了一种函数式的 UI 组件创建方式。开发者可以通过定义函数和内部组件来构建界面,并使用该函数返回的组件进行显示。

源码下载

全局弹窗的代码都提交到github上了,这个库我会一直维护,这个一个鸿蒙API使用案例的工具库,后续会陆续增加功能以及维护。

https://github.com/ansen666/harmony_tools



扫一扫 关注我的公众号

鸿蒙系统(HarmonyOS)全局弹窗实现的更多相关文章

  1. 华为 鸿蒙系统(HarmonyOS)

    HarmonyOS Ⅰ. 鸿蒙系统简介 鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主研发的操作系统.2019年8月9日,鸿蒙系统在华为开发者大会<HDC.20 ...

  2. 鸿蒙系统开源学习经验分享HarmonyOS[www.allharmonyos.com]

    分享鸿蒙系统开源知识,分享学习经验,分享鸿蒙系统开发经验 www.allharmonyos.com https://gitee.com/allharmonyos https://github.com/ ...

  3. 乘风破浪,遇见华为鸿蒙智能终端系统(HarmonyOS 2),打造面向全场景的分布式操作系统

    什么是鸿蒙智能终端系统(HarmonyOS 2) HarmonyOS 是新一代的智能终端操作系统,为不同设备的智能化.互联与协同提供了统一的语言.带来简洁,流畅,连续,安全可靠的全场景交互体验. ht ...

  4. 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!

        1. 你不知道的鸿蒙(HarmonyOS)   2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0.我在2020-9-11日也发布了全球首套鸿蒙2.0 App开发视频课 ...

  5. 鸿蒙系统freeModbusTcp移植简介

    freeModebus是工业中常用的一种通信, 在鸿蒙系统来移植 细节查看代码中,博文只是一些参考以及注意点, 参考了 wifi连接: https://harmonyos.51cto.com/post ...

  6. 鸿蒙系统应用开发之基于API6的蓝牙开发

    写在前面 由题意得,我今天讲的是基于鸿蒙系统的兼容JS的类Web开发范式的软件应用开发之蓝牙开发,它是基于API6的,至于为什么是基于API6,请你花几分钟看一下我之前写的这个系列教程的第四篇&quo ...

  7. vs如何新建自己工程的环境变量(局部)和 Windows系统(全局).

    来源:http://blog.csdn.net/jtop0/article/details/7574139        在vs2008的Project->Property设置里经常会看到类似$ ...

  8. 通过Web.config中的configSections配置自己系统的全局常量

    通过Web.config中的configSections配置自己系统的全局常量 随着系统的庞大,你的全局信息保存在appsitting里可能会比较乱,不如为模块写个自定义的全局常量吧 首先在Web.C ...

  9. vs2008如何新建自己工程的环境变量(局部)和 Windows系统(全局). .

    在vs2008的Project->Property设置里经常会看到类似$(IntDir).$(OutDir).$(ProjectName) 的预定义宏.以vc2008为例,有时候我们在引用别的库 ...

  10. Vue全局弹窗:一次注册,全局可弹

    Vue全局弹窗 今天来搞一个全局弹窗,不用每个文件都引入,只在main.js里作为全局原型引入就好了 先新建弹窗组件 toast.vue <template></template&g ...

随机推荐

  1. yb课堂之实战登陆模块开发整合Json Web Token《十》

    开发登陆模块功能,并整合Json Web Token 开发登陆功能 LoginRequest.java UserMapper.xml  UserMapper.java UserService.java ...

  2. mac电脑好用的工具总结

    制作gif:https://gfycat.com/gifbrewery 制作gif(超级好用,制作速度快,压缩图片小):https://www.cockos.com/licecap/ 解压工具:htt ...

  3. Java开发环境配置(IDEA系列)

    一.IDEA安装和破解,JDK1.8 以上或JDK 16 下一步下一步,安装jdk配置环境变量: 二.Maven安装 和IDEA集成Maven IDEA 配置 Maven 环境 1.选择 IDEA中 ...

  4. LabVIEW之项目文件结构透析

    代码的管理非常重要,LabVIEW本身自带很多代码管理工具.下面来剖析一个相对标准的小项目:

  5. [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算

    和python玩耍 Python 回忆 上次 了解shell环境中的命令 命令 作用 whoami 显示当前用户名 pwd 显示当前文件夹 ls 列出当前文件夹下的内容 python3 仿佛进入大于号 ...

  6. oeasy教您玩转vim - 3 - # 打开文件

    打开文件 回忆上节课内容 什么不会,就 :help 什么 命令有完整和简写两种模式 :help 和 :h :quit 和 :q 注意:是左右手小拇指配合输入的 vim 有 6 种基本模式 但是我们还没 ...

  7. MySQL之DQL

    *****DQL -- 数据查询语言   查询不会修改数据库表记录! 一. 基本查询 1. 字段(列)控制 1) 查询所有列  SELECT * FROM 表名;  SELECT * FROM emp ...

  8. Odoo 美化登录界面

    实践环境 Odoo 14.0-20221212 (Community Edition) Odoo Web Login Screen 14.0 https://apps.odoo.com/apps/mo ...

  9. RHCA rh442 007 hugetlbfs strace命令追踪 脏页设置 内存分配

    内存管理 虚拟内存 --- 物理内存 应用程序申请虚拟内存 --- RAM + SWAP (真正主板上的设备) 他们之间有一张映射表 page table 页表 PTE: 页表条目 虚拟内存和物理内存 ...

  10. FP分数规划在无线通信中的应用

    更多精彩内容请关注微信公众号 '优化与算法' 前言 在数学优化中,分数规划是线性分式规划的推广.分数规划中的目标函数是两个函数的比值,这两个函数通常是非线性的.要优化的比值通常描述系统的某种效率. 1 ...