##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##
参考资料: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-uicontext-custom-dialog
由于CustomDialogController在使用上存在诸多限制,不支持动态创建也不支持动态刷新,在相对较复杂的应用场景中推荐使用UIContext中获取到的PromptAction对象提供的openCustomDialog接口来实现自定义弹出框。
弹出框(openCustomDialog)可以通过配置isModal来实现模态和非模态弹窗。isModal为true时,弹出框为模态弹窗。isModal为false时,弹出框为非模态弹窗。
生命周期 弹出框提供了生命周期函数用于通知用户该弹出框的生命周期。生命周期的触发时序依次为:onWillAppear -> onDidAppear -> onWillDisappear -> onDidDisappear。
弹出框(openCustomDialog)存在两种入参方式创建自定义弹出框:
本文介绍通过入参形式为ComponentContent创建自定义弹出框,传builder形式的弹出框使用方法可参考openCustomDialog。
实现步骤:
示例代码:
import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent, promptAction, UIContext } from '@kit.ArkUI';
@Entry
@Component
struct OpenCustomDialogPage {
build() {
Column({ space: 10 }) {
Text('OpenCustomDialogPage')
.fontSize(20)
.fontWeight(FontWeight.Bold)
Button('open dialog').onClick(() => {
Dialog.setContext(this.getUIContext());
Dialog.setOptions({ alignment: DialogAlignment.Center });
let contentNode: ComponentContent<Object> =
new ComponentContent(this.getUIContext(), wrapBuilder(buildText), new Params('hello, you open a dialog'));
Dialog.setContentNode(contentNode);
Dialog.openDialog()
})
}
.height('100%')
.width('100%')
}
}
@Builder
function buildText(params: Params) {
Column() {
Text(params.text)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 36 })
Button('Close')
.onClick(() => {
Dialog.closeDialog();
})
}
.backgroundColor('#FFF0F0F0')
.padding(20)
.borderRadius(8)
.clip(true)
.margin(20)
}
class Dialog {
static ctx: UIContext;
static contentNode: ComponentContent<Object>;
static options: promptAction.BaseDialogOptions;
static setContext(context: UIContext) {
Dialog.ctx = context;
}
static setContentNode(node: ComponentContent<Object>) {
Dialog.contentNode = node;
}
static setOptions(options: promptAction.BaseDialogOptions) {
Dialog.options = options;
}
static openDialog() {
if (Dialog.contentNode !== null) {
Dialog.ctx.getPromptAction()
.openCustomDialog(Dialog.contentNode, Dialog.options)
.then(() => {
console.info('OpenCustomDialog complete.');
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
})
}
}
static updateDialog(options: promptAction.BaseDialogOptions) {
if (Dialog.contentNode !== null) {
Dialog.ctx.getPromptAction().updateCustomDialog(Dialog.contentNode, options)
.then(() => {
console.info('UpdateCustomDialog complete.');
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`UpdateCustomDialog args error code is ${code}, message is ${message}`);
})
}
}
static closeDialog() {
if (Dialog.contentNode !== null) {
Dialog.ctx.getPromptAction()
.closeCustomDialog(Dialog.contentNode)
.then(() => {
console.info('CloseCustomDialog complete.');
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`CloseCustomDialog args error code is ${code}, message is ${message}`);
})
}
}
}
class Params {
text: string = "";
constructor(text: string) {
this.text = text;
}
}
原文作者:;如有侵权,请联系管理员删除。