CustomDialog 闭坑指南
HarmonyOS提供了
CustomDialog
让用户最定义弹框,但是初步使用时踩了不少坑,现在记录如下:
必须定义controller
使用@CustomDialog
时必须定义controller变量,该变量不需要你手动初始化(名字不要求,只要是CustomDialogController就可以),
@CustomDialog
export struct MyDialog{
//不需要手动初始化,会自动初始化
private controller: CustomDialogController;
build() {
Button($r('app.string.custom_dialog_start'))
.height(40)
.fontSize(24)
.fontColor(Color.White)
.margin({ left: 4, right: 4, top: 12 })
.onClick(() => {//点击关闭
this.controller.close();
})
}
}
CustomDialogController初始化
- CustomDialogController的初始化必须在@Component修饰的组件里完成初始化,在普通的类里初始化controller时,dialogController.open()无效。Dialog不会显示
@Entry
@Component
struct CustomDialogSample {
private dialogController: CustomDialogController = new CustomDialogController({
builder: MyDialog(),
autoCancel: true
})
}
- 上面
dialogController
变量必须是全局变量,不能是局部变量,否则MyDialog
的controller
不会得到初始化,也就是下面代码会有问题,导致点击关闭按钮时this.controller.close()
会报空指针。
@Entry
@Component
struct CustomDialogSample {
showDialog(){
//局部变量,导致MyDialog的controller不会初始化
let dialogController: CustomDialogController = new CustomDialogController({
builder: MyDialog(),
autoCancel: true
})
dialogController.open();
}
}
正确写法如下:
@Entry
@Component
struct CustomDialogSample {
dialogController?:CustomDialogController
showDialog(){
//局部变量,导致MyDialog的controller不会初始化
dialogController: CustomDialogController = new CustomDialogController({
builder: MyDialog(),
autoCancel: true
})
dialogController.open();
}
}
参考资料:
自定义弹框