HarmonyOS 鸿蒙Next中一个简单的对话框居然不能自动关闭,这是谁设计的缺陷!

HarmonyOS 鸿蒙Next中一个简单的对话框居然不能自动关闭,这是谁设计的缺陷! 搜了整个开发文档,Dialog对话框找到了好几个,就是不支持关闭!神奇啊!还能不能愉快的开发了!

9 回复

【解决方案】

参考ToastShowMode,设置弹窗显示模式,支持显示在应用之外。具体用法如下:

import promptAction from '@ohos.promptAction';

promptAction.showToast({
  message: '弹窗示例', // 弹窗信息
  duration: 3000, // 时间
  showMode: promptAction.ToastShowMode.TOP_MOST  // 顶层模式(全局显示)
});

更多关于HarmonyOS 鸿蒙Next中一个简单的对话框居然不能自动关闭,这是谁设计的缺陷!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我要的对话框,你给我toast是几个意思?

问题已受理,请耐心等待,感谢理解与支持!

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

【背景知识】

  • promptAction 提供了 openCustomDialogcloseCustomDialog 方法,分别用来实现打开和关闭自定义弹窗:

【解决方案】

openCustomDialog 创建并打开弹窗时,在打开弹窗成功的回调中返回了 dialogId 表示当前打开的弹窗,通过该 id 可以唯一标识弹窗,因此可以结合 Map 等相关的数据结构,存储打开的弹窗和对应的 id 标识,以实现对页面中多个弹窗的区分。

promptAction.openCustomDialog 返回值说明如下:

类型 说明
Promise<number> 返回供 closeCustomDialog 使用的对话框 id

代码示例如下:

import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { HashMap } from '@kit.ArkTS';

@Entry
@Component
struct CustomDialogDemo {
  @State dialogNum: number = 0;
  dialogMap: HashMap<number, number> = new HashMap();
  @Builder customDialogComponent(dialogNumber: number) {
    Column() {
      Text('弹窗' + dialogNumber).fontSize(30)
      Row({ space: 50 }) {
        Button("关闭弹窗").onClick(() => {
          try {
            // 关闭时找到对应的弹窗 id,进而实现关闭指定的弹窗
            promptAction.closeCustomDialog(this.dialogMap.get(dialogNumber));
          } catch (error) {
            let message = (error as BusinessError).message;
            let code = (error as BusinessError).code;
            console.error(`closeCustomDialog error code is ${code}, message is ${message}`);
          }
        })
      }
    }.height(500).padding(5)
    .backgroundColor(Color.Pink)
    .margin({left: dialogNumber * 20})
  }

  build() {
    Column({ space: 20 }) {
      Text('点击打开弹窗')
        .fontSize(30)
        .onClick(() => {
          this.dialogNum += 1;
          promptAction.openCustomDialog({
            builder: () => {
              this.customDialogComponent(this.dialogNum);
            },
            isModal: false
          }).then((dialogId: number) => {
            // 存储对应的弹框 id
            this.dialogMap.set(this.dialogNum, dialogId);
          })
          .catch((error: BusinessError) => {
            console.error(`openCustomDialog error code is ${error.code}, message is ${error.message}`);
          })
        })
    }
    .width('100%')
}

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

有没有更简单的方法?在我的认知里,一个alert('123')就能搞定事情,为啥需要自定义!

鸿蒙Next的对话框需要手动调用dismiss()方法关闭,这是设计规范。对话框组件默认保持展示状态,确保用户完成操作交互。可通过设置autoCancel属性为true来启用点击外部关闭功能,但不会自动超时关闭。该行为符合MD设计准则,确保对话框内容被充分阅读。

在HarmonyOS Next中,Dialog组件确实需要开发者手动控制关闭逻辑,这是设计上的灵活性考虑而非缺陷。通过调用show()显示对话框后,您需要在适当的业务逻辑中(如按钮点击事件)调用destroy()方法来关闭对话框。这种设计让开发者能更精确地控制对话框生命周期,适应不同场景需求(如异步操作完成后再关闭)。文档中AlertDialog和CustomDialog都明确提供了关闭方法,建议仔细查阅组件API。

回到顶部