HarmonyOS 鸿蒙Next 有没有一种方法可以把全局的自定义dialog都关闭
HarmonyOS 鸿蒙Next 有没有一种方法可以把全局的自定义dialog都关闭
有没有一种方法可以把全局的自定义dialog都关闭?
现在有一个场景是在app内,A页面触发某个接口需要跳转到登录页面,当A页面有自定义弹窗时,登录页面会被自定义弹窗盖住,有没有一种方法可以全局把弹窗关闭?
弹窗太多,不太适合每个弹窗都监听跳转登录页面然后关闭本身的方法处理。
可以创建一个全局弹窗管理的对象,注册全局事件来维护弹窗弹窗对象。参考代码如下:
可以创建一个全局弹窗管理的对象,注册全局事件来维护弹窗弹窗对象。参考代码如下:
EntryAbility.ets文件
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let context = this.context;
let eventhub = this.context.eventHub;
AppStorage.setOrCreate('dialogList', []);
eventhub.on('addDiaLog', (data: CustomDialogController ) => {
let dialogList:SubscribedAbstractProperty<CustomDialogController[]> = AppStorage.link('dialogList');
let dialoginfo:CustomDialogController[] = dialogList.get();
dialoginfo.push(data);
dialogList.set(dialoginfo)
});
eventhub.on('closeAllDiaLog', ()=>{
let dialogList:SubscribedAbstractProperty<CustomDialogController[]> = AppStorage.link('dialogList');
let dialoginfo:CustomDialogController[] = dialogList.get();
for (let elem of dialoginfo.values()) {
elem.close();
}
})
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
}
复制
Index.ets文件
import common from '[@ohos](/user/ohos).app.ability.common';
[@CustomDialog](/user/CustomDialog)
struct CustomDialogExampleTwo {
private context = getContext(this) as common.UIAbilityContext;
controllerTwo?: CustomDialogController
build() {
Column() {
Text('我是第二个弹窗')
.fontSize(30)
.height(100)
Button('点我关闭所有弹窗')
.onClick(() => {
this.context.eventHub.emit('closeAllDiaLog');
// if (this.controllerTwo != undefined) {
// this.controllerTwo.close()
// }
})
.margin(20)
}
}
}
[@CustomDialog](/user/CustomDialog)
struct CustomDialogExample {
private context = getContext(this) as common.UIAbilityContext;
[@Link](/user/Link) textValue: string
[@Link](/user/Link) inputValue: string
dialogControllerTwo: CustomDialogController | null = new CustomDialogController({
builder: CustomDialogExampleTwo(),
alignment: DialogAlignment.Bottom,
offset: { dx: 0, dy: -25 } })
controller?: CustomDialogController
// 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在所有controller的后面
cancel: () => void = () => {
}
confirm: () => void = () => {
}
aboutToAppear() {
this.context.eventHub.emit('addDiaLog', this.dialogControllerTwo);
}
build() {
Column() {
Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
.onChange((value: string) => {
this.textValue = value
})
Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })
Flex({ justifyContent: FlexAlign.SpaceAround }) {
Button('cancel')
.onClick(() => {
if (this.controller != undefined) {
this.controller.close()
this.cancel()
}
}).backgroundColor(0xffffff).fontColor(Color.Black)
Button('confirm')
.onClick(() => {
if (this.controller != undefined) {
this.inputValue = this.textValue
this.controller.close()
this.confirm()
}
}).backgroundColor(0xffffff).fontColor(Color.Red)
}.margin({ bottom: 10 })
Button('点我打开第二个弹窗')
.onClick(() => {
if (this.dialogControllerTwo != null) {
this.dialogControllerTwo.open()
}
})
.margin(20)
}.borderRadius(10)
// 如果需要使用border属性或cornerRadius属性,请和borderRadius属性一起使用。
}
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
private context = getContext(this) as common.UIAbilityContext;
[@State](/user/State) textValue: string = ''
[@State](/user/State) inputValue: string = 'click me'
dialogController: CustomDialogController | null = new CustomDialogController({
builder: CustomDialogExample({
cancel: ()=> { this.onCancel() },
confirm: ()=> { this.onAccept() },
textValue: $textValue,
inputValue: $inputValue
}),
cancel: this.exitApp,
autoCancel: true,
alignment: DialogAlignment.Bottom,
offset: { dx: 0, dy: -20 },
gridCount: 4,
customStyle: false,
cornerRadius: 10,
})
aboutToAppear() {
this.context.eventHub.emit('addDiaLog', this.dialogController);
}
// 在自定义组件即将析构销毁时将dialogControlle置空
aboutToDisappear() {
this.dialogController = null // 将dialogController置空
}
onCancel() {
console.info('Callback when the first button is clicked')
}
onAccept() {
console.info('Callback when the second button is clicked')
}
exitApp() {
console.info('Click the callback in the blank area')
}
build() {
Column() {
Button(this.inputValue)
.onClick(() => {
if (this.dialogController != null) {
this.dialogController.open()
}
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
更多关于HarmonyOS 鸿蒙Next 有没有一种方法可以把全局的自定义dialog都关闭的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS 鸿蒙Next系统中,关闭全局的自定义dialog可以通过以下方式实现:
HarmonyOS提供了一套UI框架,允许开发者对界面元素进行统一管理。要关闭全局的自定义dialog,可以利用系统级的事件广播或全局状态管理机制。具体来说,可以定义一个全局变量或状态标识,用于记录当前是否有自定义dialog显示。当需要关闭所有dialog时,修改这个全局变量的状态,并通过事件监听或状态监听机制,通知所有已经打开的dialog进行关闭操作。
此外,HarmonyOS的AbilityManager提供了对Ability的管理能力,你可以通过AbilityManager获取当前已经启动的Ability列表,并遍历这些Ability,调用其提供的接口来关闭相应的自定义dialog。但这种方法需要确保每个Ability在创建dialog时都遵循了统一的接口规范,以便能够统一关闭。
需要注意的是,关闭全局dialog的操作可能会影响用户体验,应谨慎使用,并确保在合适的时机进行。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html