HarmonyOS 鸿蒙Next使用自定义dialog时遇到的问题

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next使用自定义dialog时遇到的问题

写了个dialog弹窗自定义组件,用的是这个:promptAction.openCustomDialog,最后通过

export let DialogUtil = new DialogUtils()导出,

使用过程中遇到几个问题:

1、如果一个页面出现多个弹窗,比如隐私协议,权限申请等等,上面这个弹窗就无法弹出,需要延时才行,断点时弹窗调用是执行了的,也返回了dialogId

2、当弹窗弹出成功时,有返回dialogId,在使用dialogId关闭窗口时, dialogId变成 0,目前是使用AppStorage临时保存,如果dialogId为0时就从里面取值。

以下是大概的代码:

let dialogId: number|undefined = 0

@Component
struct DialogUtils {

  show(config: Config) {

    promptAction.openCustomDialog({
      builder: () => {
        this.dialogBuilder(config)
      },
      backgroundBlurStyle: BlurStyle.NONE,
      alignment: DialogAlignment.Center,
      maskColor: '#90000000',
      cornerRadius: 10,
      autoCancel: !config.isForce,
      onWillDismiss: (action: DismissDialogAction) => {
      }
    }).then((dialogId: number) => {
      dialogId = dialogId
    }).catch((e:BusinessError)=>{
    })
  }

  @Builder
  dialogBuilder(config: UpdateConfig) {
    Column() {
      Stack({ alignContent: Alignment.TopStart }) {
        Image($r('app.media.bg'))
          .objectFit(ImageFit.Contain)

        Text(config.content)
          .margin({
            left: 24,
            top: 140,
            right: 24,
            bottom: 70
          })
          .constraintSize({ maxHeight: 120 })
          .fontSize(14)
          .fontColor(Color.White)

      }
      .constraintSize({ minHeight: 320 })
      .width(StyleConstants.FULL_PERCENT)
      .aspectRatio(0.92)

      Image($r('app.media.btn'))
        .objectFit(ImageFit.Contain)
        .margin({ top: -20 })
        .width(190)
        .height(40)
        .onClick(() => {
          promptAction.closeCustomDialog(dialogId)
          if (config.messageCallBack) {
            config.messageCallBack()
          }
        })

      Image($r('app.media.close'))
        .objectFit(ImageFit.Contain)
        .width(40)
        .height(40)
        .margin({ top: 40 })
        .visibility(config.isForce ? Visibility.None : Visibility.Visible)
        .onClick(() => {
          promptAction.closeCustomDialog(dialogId)
          if (config.closeCallBack) {
            config.closeCallBack()
          }
        })
    }
    .width('90%')
  }

  build() {
  }
}

export let DialogUtil = new DialogUtils()

更多关于HarmonyOS 鸿蒙Next使用自定义dialog时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

cke_120.png

随时随处弹,亲测有效

更多关于HarmonyOS 鸿蒙Next使用自定义dialog时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如果页面有多个权限申请窗口,也能弹出来?

有系统弹窗存在的情况,没试过,不过这个弹窗可以弹多层,比如弹一个隐私协议,上面再弹一个提示,

我试了下,只要有权限弹窗,这个也弹不了,目前的使用了Stack层级去实现了,

Config和UpdateConfig这两个麻烦提供下,这边再基于demo分析下问题

目前使用Stack实现了,没用dialog,如果遇到有系统弹窗,还是弹不了。

建议使用Navigation的Dialog模式来写弹窗,可操作性高

在HarmonyOS鸿蒙Next系统中使用自定义dialog时,可能遇到的问题通常与dialog的布局、显示逻辑以及生命周期管理相关。以下是一些可能的原因及解决方法:

  1. 布局问题:

    • 确保自定义dialog的布局文件(XML)正确无误,且所有控件的属性设置合理。
    • 检查布局文件中是否有不兼容的组件或属性,这些可能在鸿蒙系统中不被支持。
  2. 显示逻辑:

    • 在创建和显示dialog时,确保使用鸿蒙提供的Dialog组件及相关API。
    • 检查dialog的显示时机,确保在UI线程中正确调用显示方法。
  3. 生命周期管理:

    • 自定义dialog在显示和隐藏时,可能会触发一些生命周期回调,确保这些回调中的代码逻辑正确。
    • 如果dialog中包含异步操作(如网络请求),需确保这些操作在dialog销毁时得到妥善处理,避免内存泄漏或程序崩溃。
  4. 事件处理:

    • 确保自定义dialog中的事件(如按钮点击)得到正确处理,且事件处理逻辑与鸿蒙系统的交互规范相符。

如果以上方法仍无法解决问题,可能是特定于你的应用或鸿蒙系统版本的bug。此时,建议直接联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部