背景:前端arkui-x,后端android-java,Android 13系统

arkui-x的sdk:2.0.0.41,OpenHarmony sdk:5.0.0.25

需求是长按页面元素弹出一个弹窗,需要定制样式,这个弹窗上的删除按钮可触发二次弹窗。

但在开发过程中多次遇到弹窗挂死无法退出的问题。

长按自然就选择了LongPressGesture,一般标准写法为:

// customdialog定义
...... // 参数定义省略
AppOpMenuController: CustomDialogController = new CustomDialogController({
  builder: AppOpMenu({ text: $popText, index: $index, isDelete: $isDelete, isSys: $isSys, packageName: $packageName }),
  alignment: DialogAlignment.Center,
  autoCancel: true,
  cancel: () => {
    console.log("cancel")         // 点击蒙层的回调
  },
  customStyle: true
})
...... // 具体元素省略
.gesture(
  // 绑定可以重复触发的LongPressGesture
  LongPressGesture({ repeat: false })
    .onAction((event: GestureEvent) => {
......
      this.AppOpMenuController.open()    // 此为提前定义的customdialog
    })
    .onActionEnd(() => {
    })
)

因为customdialog弹开时,弹窗外区域为蒙层(mask层),默认点击蒙层(mask层)可以退出弹窗。如果想修改为点击蒙层不能退出,则设置autoCancel为false。

问题场景1:真机测试时,长按弹开弹窗,在弹窗上随便做一些操作,再点击蒙层退出。快速多次重复这个过程,就极容易触发弹窗挂死,无法退出,然后就没法作任何操作了,只能重启app。

具体复现步骤如下:

长按触发弹窗

点击第一个按钮,切换一下弹窗的设置

点击蒙层退出

再重新长按触发

多次循环操作后,某次点击蒙层退出,弹窗颜色变淡,但是没有退出。此时点击蒙层,没有任何反应,也无法作其他操作。

视频:

202411071220

补充说明:

主要页面用onHover,弹窗用onFocus复现概率高

弹窗不用onFocus,只使用onHover时,复现概率低

问题场景2:问题1是只操作第一个弹窗挂死的问题。如果在第一个弹窗上,触发二次弹窗,这样触发挂死的概率极高。动作稍微快一点就很容易触发。

视频:

2024-11-08-14-45-34

问题已经反馈上去,估计近期会得到解决。

2025-1-24:

解决方案见:鸿蒙开发黑科技“stack叠层”替代customdialog-CSDN博客

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐