鸿蒙系统(HarmonyOS)全局弹窗实现

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

  • 封装更彻底,一行代码就能调用
  • 跟组件耦合度低,只需要传入组件的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

在这里插入图片描述

扫一扫 关注我的公众号
<think>嗯,用户想了解HarmonyOS Next弹窗实现方式和常见问题。首先,我需要回忆一下之前提供的引用内容,看看有哪些相关的信息。根据引用[1]、[3]、[4]、[5],弹窗实现方式包括使用ArkUI组件,自定义弹窗,以及全局状态保留弹窗。常见问题可能涉及居中显示、样式定制、状态保留等。 首先,系统级指令要求使用中文回答,数学公式用$...$,独立公式用$$...$$。不过这个问题可能不涉及数学公式,所以暂时不需要处理这部分。然后需要生成相关问题,放在最后。 用户的问题分为两部分:实现方式和常见问题。需要分点回答,结构清晰。根据引用,ArkUI的AlertDialog组件是基础方式,自定义弹窗可以通过@CustomDialog装饰器,全局状态保留弹窗则涉及GlobalStateDialog之类的工具,如引用[4]提到的GlobalStateDialog.ets。 常见问题部分,居中显示可以参考引用[1]中的方法,使用flex布局的justifyContent和alignItems属性。样式定制可能需要修改背景、圆角等,如引用[3]提到的进阶用法。状态保留可能通过@LocalStorageLink或AppStorage实现,如引用[4]中的全局状态控制。性能优化方面,需要注意避免复杂布局影响渲染效率,引用[3]提到动态路由案例可能有相关优化方法。 相关问题需要根据内容生成,比如如何自定义布局、处理交互事件、优化性能等。另外,用户提到的引用中有动态路由案例、分布式应用开发等内容,可能可以作为相关问题的一部分。 需要确保回答正确引用对应的引用编号,比如提到居中显示时引用[1],全局状态保留引用[4]和[5]。同时,代码示例要符合HarmonyOS的ArkTS语法,如引用[3]中的代码结构。 最后,检查是否有遗漏的实现方式或问题,确保覆盖用户可能关心的点。比如弹窗的显示隐藏控制、多端适配等,虽然引用中没有直接提到,但可能属于常见问题的一部分,需要结合已有信息合理推断。</think>### HarmonyOS Next 弹窗实现方式与常见问题解析 #### 一、弹窗实现方式 1. **ArkUI基础组件** 使用`AlertDialog`或`CustomDialog`等内置组件实现基础弹窗功能。例如: ```typescript AlertDialog.show({ title: '提示', message: '操作确认', primaryButton: { value: '确定', action: () => {} }, secondaryButton: { value: '取消' } }) ``` 2. **自定义弹窗** 通过`@CustomDialog`装饰器实现高度定制的弹窗,支持动态布局和交互逻辑[^3]。示例: ```typescript @CustomDialog struct CustomDialogExample { build() { Column() { Text('自定义内容').fontSize(20) Button('关闭').onClick(() => CustomDialog.close()) }.padding(20) } } ``` 3. **全局状态保留弹窗** 通过`GlobalStateDialog`结合`LocalStorage`或`AppStorage`实现跨页面的状态管理[^4][^5]。适用于评论组件等需要持久化状态的场景。 #### 二、常见问题与解决方案 1. **弹窗居中显示问题** - **方法**:使用`Flex`布局的`justifyContent(FlexAlign.Center)`和`alignItems(VerticalAlign.Center)`属性[^1]。 - **代码示例**: ```typescript Column() { // 弹窗内容 } .width('80%') .justifyContent(FlexAlign.Center) .alignItems(HorizontalAlign.Center) ``` 2. **样式定制限制** - **背景透明**:通过`.backgroundColor(0x33000000)`设置半透明遮罩。 - **圆角处理**:使用`.borderRadius(16)`修饰弹窗容器[^3]。 3. **状态保留失效** - **原因**:未正确使用状态管理工具。 - **解决方案**:通过`@LocalStorageLink`或`AppStorage`实现全局状态同步。 4. **多端适配问题** - **策略**:使用响应式布局单位(`vp`)和`栅格系统`适配不同设备尺寸。 5. **性能优化** - **建议**:避免在弹窗内嵌套复杂组件树,使用`LazyForEach`优化列表渲染。 #### 三、进阶实践 - **动态弹窗内容**:参考动态路由案例实现动态内容加载。 - **分布式弹窗**:结合HarmonyOS分布式能力,实现跨设备弹窗联动[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安辉就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值