鸿蒙开发:openCustomDialog关闭指定Dialog

前言

本文基于Api13

openCustomDialog弥补了CustomDialogController在使用上存在的诸多限制,实现了可以在任意位置上弹出,可以说是非常的方便;但是,在使用的时候遇到了一些小阻碍,比如一个页面中可能存在多个弹窗,而这些弹窗的隐藏顺序是不确定的,如何可以根据一定的条件,隐藏其中对应的弹窗呢,也就是,如何隐藏指定的弹窗,而不是最上层的弹窗。

目前呢,有两种实现方式,一种是通过存储ComponentContent来实现,另一种就是通过存储dialogId来实现,那么我们本篇文章,就针对这两种实现方式一一进行举例说明。

存储ComponentContent实现关闭指定Dialog

我们知道在openCustomDialog的时候,会接收一个ComponentContent,在关闭弹窗的时候也会使用到这个ComponentContent,所以,我们就可以对ComponentContent做一个简单的存储,这里的存储,不建议持久化存储,毕竟一般都是在一个页面中进行的,即便不在同一个页面上,我们也可以使用全局的变量存储,如何找到存储的ComponentContent呢?,这里推荐使用HashMap,键值对这种形式存储,可以很方便的使用key找到对应的value。

弹出Dialog

在弹窗弹出之后,使用map集合进行存储,在弹出Dialog的时候,需要传一个标识,也就是这个Dialog对应的key。

TypeScript 复制代码
 private showDialog(key: string) {
    let uiContext = this.getUIContext()
    let promptAction = uiContext.getPromptAction()
    let contentNode = new ComponentContent(uiContext, wrapBuilder(TextDialog))
    promptAction.openCustomDialog(contentNode).then(() => {
      //临时存储
      this.mCustomDialogMap.set(key, contentNode)
    })
  }

隐藏Dialog

隐藏的时候,直接传递对应的key即可,记得,隐藏之后移除map中的元素。

TypeScript 复制代码
private hideDialog(key: string) {
    if (this.mCustomDialogMap.hasKey(key)) {
      let uiContext = this.getUIContext()
      let promptAction = uiContext.getPromptAction()
      let contentNode = this.mCustomDialogMap.get(key)
      promptAction.closeCustomDialog(contentNode).then(() => {
        //隐藏之后删除
        this.mCustomDialogMap.remove(key)
      })
    }
  }

存储dialogId实现关闭指定Dialog

存储dialogId和存储ComponentContent逻辑上基本上是一致的,但是显示出UI的方式需要切换下,由于dialogId的获取,必须通过builder的方式,所以这里,传递ComponentContent改为内部定义的@Builder,如果想要使用全局的UI组件,可以在定义的Builder里进行。

弹出Dialog

TypeScript 复制代码
private showDialog(key: string) {
    let uiContext = this.getUIContext()
    let promptAction = uiContext.getPromptAction()
    promptAction.openCustomDialog({
      builder: () => {
        this.TextDialog(message)
      }
    }).then((dialogId: number) => {
      this.mCustomDialogMap.set(key, dialogId)
    })
  }

隐藏Dialog

TypeScript 复制代码
private hideDialog(key: string) {
    if (this.mCustomDialogMap.hasKey(key)) {
      let uiContext = this.getUIContext()
      let promptAction = uiContext.getPromptAction()
      let dialogId = this.mCustomDialogMap.get(key)
      promptAction.closeCustomDialog(dialogId)
      //隐藏之后删除
      this.mCustomDialogMap.remove(key)
    }
  }

相关总结

以上呢就是两种隐藏指定的Dialog方式,比较的简单,具体的场景,常见于,页面多个弹出Dialog,但是需要隐藏指定的Dialog场景,当然了,也适用于常见的普通场景。

相关推荐
智塑未来14 小时前
鸿蒙游戏体验手册:四种能力从性能到玩法逐一解锁
游戏·华为·harmonyos
math_hongfan15 小时前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
math_hongfan18 小时前
鸿蒙企业级数据存储高级架构:从读写分离到冷热数据分层/归档策略/数据生命周期管理最佳实践
人工智能·学习·华为·架构·harmonyos·鸿蒙
math_hongfan21 小时前
鸿蒙存储异常高级排查:文件损坏检测/数据恢复/读写失败重试/磁盘空间预警系统性根治方案
学习·华为·harmonyos·鸿蒙
lilian23321 小时前
Harmony os 技术实战|拼豆制图10:把取消、解析失败和保存失败写成可恢复状态机
java·javascript·华为·harmonyos
2501_9197490321 小时前
华为鸿蒙美缝剂实用APP—小羊美缝
华为·harmonyos
2501_9197490321 小时前
华为鸿蒙积攒年度高光APP—小羊高光
华为·harmonyos
智塑未来1 天前
鸿蒙7碰一碰智感交互——碰哪儿传哪儿
华为·harmonyos
math_hongfan1 天前
鸿蒙存储碎片高级清理机制:数据库Vacuum/文件碎片整理/缓存过期清理/主动空间回收策略
jvm·数据库·学习·缓存·华为·harmonyos·鸿蒙
梦想不只是梦与想1 天前
鸿蒙UI测试框架:UITest
harmonyos·uitest·ui测试框架