华为仓颉鸿蒙HarmonyOS5 NEXT仓颉原生CustomDialogController 自定义弹窗
/ 自定义弹窗内容Column() {Text("这是一个自定义弹窗")Button("取消").onClick { evt =>controller?.close()Button("确认").onClick { evt =>controller?.close()
·
自定义弹窗使用指南
基本概念
自定义弹窗组件通过@CustomDialog修饰,用于创建可自定义样式和内容的弹窗。使用时需注意以下要点:
1.必须用@CustomDialog修饰弹窗类
2.弹窗类必须包含Option<CustomDialogController>类型的属性
3.弹窗参数在构造时确定,不支持动态刷新
使用步骤
1. 创建自定义弹窗类
@CustomDialog
class MyDialog {
var controller: Option<CustomDialogController> = Option.None
func build() {
// 自定义弹窗内容
Column() {
Text("这是一个自定义弹窗")
.fontSize(30)
.margin(20)
Button("取消").onClick { evt =>
controller?.close()
}.margin(10)
Button("确认").onClick { evt =>
controller?.close()
}.margin(10)
}
.width(400)
.height(300)
.backgroundColor(Color.White)
}
}
2. 在主界面中使用弹窗
@Entry
@Component
struct MyView {
// 创建弹窗控制器
var dialogController: CustomDialogController = CustomDialogController(
CustomDialogControllerOptions(
builder: MyDialog() // 传入弹窗实例
)
)
build() {
Column() {
Button("打开弹窗")
.onClick(() => {
dialogController.open() // 打开弹窗
})
.margin(20)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
参数配置
CustomDialogControllerOptions提供丰富的配置选项:
CustomDialogControllerOptions(
builder: () -> Unit, // 弹窗内容构建器
cancel: () -> Unit = {}, // 关闭回调
autoCancel: Bool = true, // 是否允许点击遮罩关闭
alignment: DialogAlignment = DialogAlignment.Default, // 对齐方式
offset: Offset = Offset(0.vp, 0.vp), // 偏移量
customStyle: Bool = false, // 是否自定义样式
gridCount: Option<Int32> = Option.None, // 栅格宽度
maskColor: Color = Color(0x33000000), // 遮罩颜色
maskRect: Rectangle = Rectangle(), // 遮罩区域
openAnimation: Option<AnimateParam> = Option.None, // 打开动画
closeAnimation: Option<AnimateParam> = Option.None, // 关闭动画
showInSubWindow: Bool = false, // 是否在子窗口显示
backgroundColor: Option<Color> = Option.None, // 背景色
cornerRadius: Length = 24.vp // 圆角半径
)
功能方法
-
打开弹窗:
dialogController.open() -
关闭弹窗:
dialogController.close() -
设置构建器(通常不需要手动调用):
dialogController.setBuilder(() => { /* 构建内容 */ }) -
绑定视图(通常不需要手动调用):
dialogController.bindView(customView)
注意事项
- 弹窗内容构建器
builder不能是变量,必须在初始化时直接传入 - 混合页面场景下不支持设置动画属性
showInSubWindow为true的弹窗无法触发另一个showInSubWindow为true的弹窗- 自定义样式(
customStyle=true)时,宽度跟随子节点,圆角为0,背景透明
完整示例
@CustomDialog
class CustomAlertDialog {
var controller: Option<CustomDialogController> = Option.None
func build() {
Column() {
Text("警告")
.fontSize(32)
.fontColor(Color.Red)
.margin(20)
Text("确定要删除该文件吗?")
.fontSize(28)
.margin(20)
Row() {
Button("取消")
.onClick(() => {
controller?.close()
})
.width(120)
.height(50)
.marginRight(20)
Button("确定")
.onClick(() => {
// 执行删除操作
controller?.close()
})
.width(120)
.height(50)
}
.marginTop(30)
}
.width(400)
.height(250)
.justifyContent(FlexAlign.Center)
}
}
@Entry
@Component
struct MainView {
var alertDialogController: CustomDialogController = CustomDialogController(
CustomDialogControllerOptions(
builder: CustomAlertDialog(),
alignment: DialogAlignment.Center,
maskColor: Color(0x55000000),
cornerRadius: 16.vp,
openAnimation: {
// 自定义打开动画
},
closeAnimation: {
// 自定义关闭动画
}
)
)
build() {
Column() {
Button("显示警告弹窗")
.onClick(() => {
alertDialogController.open()
})
.width('80%')
.height(50)
.margin(20)
.backgroundColor(Color.Blue)
.fontColor(Color.White)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
通过以上方式,您可以灵活地创建和管理自定义样式的弹窗
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)