HarmonyOS 鸿蒙Next中一个简单的对话框居然不能自动关闭,这是谁设计的缺陷!
HarmonyOS 鸿蒙Next中一个简单的对话框居然不能自动关闭,这是谁设计的缺陷! 搜了整个开发文档,Dialog对话框找到了好几个,就是不支持关闭!神奇啊!还能不能愉快的开发了!
【解决方案】
参考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是几个意思?
问题已受理,请耐心等待,感谢理解与支持!
【背景知识】
promptAction
提供了openCustomDialog
和closeCustomDialog
方法,分别用来实现打开和关闭自定义弹窗:- openCustomDialog:打开自定义弹窗,弹窗支持自定义样式,如宽度、高度、背景色、阴影。
- closeCustomDialog:关闭自定义弹窗。
【解决方案】
在 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。