1# 弹出框控制器 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @houguobiao--> 5<!--Designer: @houguobiao--> 6<!--Tester: @lxl007--> 7<!--Adviser: @HelloCrease--> 8ArkUI的弹出框控制器在绑定弹出框后,可提供对弹出框的操作能力,当前支持关闭功能。可以将控制器传入弹出框内容区域后进行操作。 9 10从API version 18开始,可设置controller参数以绑定[DialogController](../reference/apis-arkui/js-apis-promptAction.md#dialogcontroller18)控制器,通过控制器能够操作弹出框。 11 12## 使用约束 13 14目前[openCustomDialogWithController](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#opencustomdialogwithcontroller18)和[presentCustomDialog](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#presentcustomdialog18)支持通过controller参数来绑定弹出框进行操作,目前[getDialogController](../reference/apis-arkui/arkui-ts/ts-custom-component-api.md#getdialogcontroller18)支持获取自定义组件所在的弹出框的控制器。 15 16> **说明:** 17> 18> 一个弹出框控制器只能绑定一个弹出框,且操作只对该弹出框生效。 19> 使用[getDialogController](../reference/apis-arkui/arkui-ts/ts-custom-component-api.md#getdialogcontroller18)获取弹出框控制器时,如果当前自定义组件不在弹出框中显示则获取为undefined。 20 21## 创建自定义内容为ComponentContent的弹出框控制器 22 23> **说明:** 24> 25> 详细变量定义请参考[完整示例](#完整示例)。 26 271. 初始化一个自定义弹出框内容区的入参类,内部包含弹出框控制器。 28 29 ```ts 30 class Params { 31 public text: string = '' 32 public dialogController: promptAction.CommonController = new promptAction.DialogController() 33 constructor(text: string, dialogController: promptAction.CommonController) { 34 this.text = text 35 this.dialogController = dialogController 36 } 37 } 38 ``` 39 402. 初始化一个自定义的弹出框内容区,内部包含一个按钮,该按钮通过该自定义组件自带的弹出框控制器实现关闭功能。 41 42 ```ts 43 @Component 44 struct MyComponent { 45 build() { 46 Column({ space: 5 }) { 47 Button('点我关闭弹窗:通过自定义组件自带的DialogController') 48 .onClick(() => { 49 let dialogController: promptAction.DialogController = this.getDialogController() 50 if (dialogController !== undefined) { 51 dialogController.close() 52 } 53 }) 54 } 55 } 56 } 57 ``` 58 593. 初始化另一自定义弹出框内容区,其中包含一个Text组件和一个按钮,该按钮通过外部传递的弹出框控制器用于关闭弹出框,并且该内容区还包含前一个自定义弹出框内容区。 60 61 ```ts 62 @Builder 63 function buildText(params: Params) { 64 Column({ space: 5 }) { 65 Text(params.text) 66 .fontSize(30) 67 if (params.dialogController !== undefined) { 68 Button('点我关闭弹窗:通过外部传递的DialogController') 69 .onClick(() => { 70 params.dialogController.close() 71 }) 72 } 73 MyComponent() 74 } 75 .width(300) 76 .height(200) 77 .backgroundColor('#FFF0F0F0') 78 } 79 ``` 80 814. 初始化一个弹出框控制器,并通过设置控制器参数来初始化一个弹出框内容实体对象。最后,通过调用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中的[getPromptAction](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getpromptaction)方法获取[PromptAction](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md)对象,再通过该对象调用[openCustomDialogWithController](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#opencustomdialogwithcontroller18)接口,并且设置初始化的内容实体对象和控制器参数以创建弹出框。 82 83 ```ts 84 let dialogController: promptAction.CommonController = new promptAction.DialogController() 85 let contentNode: ComponentContent<Object> = 86 new ComponentContent(this.getUIContext(), wrapBuilder(buildText), new Params(this.message, dialogController)) 87 this.getUIContext().getPromptAction().openCustomDialogWithController( 88 contentNode, dialogController, this.baseDialogOptions).catch((err: BusinessError) => { 89 console.error('openCustomDialogWithController error: ' + err.code + ' ' + err.message) 90 }) 91 ``` 92 93## 创建自定义内容为CustomBuilder的弹出框控制器 94 95> **说明:** 96> 97> 详细变量定义请参考[完整示例](#完整示例)。 98 991. 初始化一个自定义弹出框内容区,内部包含一个Text组件和一个按钮,该按钮通过外部传递的弹出框控制器实现关闭功能。 100 101 ```ts 102 @Builder customDialogComponent(dialogController: promptAction.DialogController) { 103 Column({ space: 5 }) { 104 Text(this.message) 105 .fontSize(30) 106 if (dialogController !== undefined) { 107 Button('点击关闭弹窗:通过外部传递的DialogController') 108 .onClick(() => { 109 dialogController.close() 110 }) 111 } 112 } 113 .height(200) 114 .padding(5) 115 .justifyContent(FlexAlign.SpaceBetween) 116 .backgroundColor('#FFF0F0F0') 117 } 118 ``` 119 1202. 初始化一个弹出框控制器,并通过调用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中的[getPromptAction](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getpromptaction)方法获取[PromptAction](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md)对象,再通过该对象调用[presentCustomDialog](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#presentcustomdialog18)接口,设置初始化的内容实体对象和控制器参数以创建弹出框。 121 122 ```ts 123 let dialogController: promptAction.CommonController = new promptAction.DialogController() 124 this.getUIContext().getPromptAction().presentCustomDialog(() => { 125 this.customDialogComponent(dialogController) 126 }, dialogController, this.dialogOptions).catch((err: BusinessError) => { 127 console.error('presentCustomDialog error: ' + err.code + ' ' + err.message) 128 }) 129 ``` 130 131## 创建自定义内容为CustomBuilderWithId的弹出框控制器 132 133> **说明:** 134> 135> 详细变量定义请参考[完整示例](#完整示例)。 136 1371. 初始化一个弹出框内容区,内部包含一个Text组件、一个通过外部传递的弹出框ID用于关闭弹出框的按钮和一个通过外部传递的弹出框控制器用于关闭弹出框的按钮。 138 139 ```ts 140 @Builder customDialogComponentWithId(dialogId: number, dialogController: promptAction.DialogController) { 141 Column({ space: 5 }) { 142 Text(this.message) 143 .fontSize(30) 144 if (dialogId !== undefined) { 145 Button('点击关闭弹窗:通过DialogID') 146 .onClick(() => { 147 this.getUIContext().getPromptAction().closeCustomDialog(dialogId) 148 }) 149 } 150 if (dialogController !== undefined) { 151 Button('点击关闭弹窗:通过外部传递的DialogController') 152 .onClick(() => { 153 dialogController.close() 154 }) 155 } 156 } 157 } 158 ``` 159 1602. 初始化一个弹出框控制器,并通过调用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中的[getPromptAction](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getpromptaction)方法获取[PromptAction](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md)对象,再通过该对象调用[presentCustomDialog](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#presentcustomdialog18)接口,设置初始化的内容实体对象和控制器参数以创建弹出框。 161 162 ```ts 163 let dialogController: promptAction.CommonController = new promptAction.DialogController() 164 this.getUIContext().getPromptAction().presentCustomDialog((dialogId: number) => { 165 this.customDialogComponentWithId(dialogId, dialogController) 166 }, dialogController, this.dialogOptions).catch((err: BusinessError) => { 167 console.error('presentCustomDialog error: ' + err.code + ' ' + err.message) 168 }) 169 ``` 170 171## 在CustomDialogController内容区直接获取弹出框控制器 172 173> **说明:** 174> 175> 详细变量定义请参考[完整示例](#完整示例)。 176 1771. 初始化一个自定义弹出框内容区,内部包含一个Text组件和一个按钮,该按钮通过弹出框控制器关闭弹出框。 178 179 ```ts 180 @CustomDialog 181 @Component 182 struct CustomDialogExample { 183 controller?: CustomDialogController 184 185 build() { 186 Column({ space: 5 }) { 187 Text('我是内容') 188 .fontSize(30) 189 Button('点我关闭弹窗:通过自定义组件自带的DialogController') 190 .onClick(() => { 191 let dialogController: PromptActionDialogController = this.getDialogController() 192 if (dialogController !== undefined) { 193 dialogController.close() 194 } 195 }) 196 } 197 .height(200) 198 .backgroundColor('#FFF0F0F0') 199 } 200 } 201 ``` 202 2032. 初始化一个自定义弹出框构造器,关联自定义弹出框内容区。 204 205 ```ts 206 let customDialogController: CustomDialogController = new CustomDialogController({ 207 builder: CustomDialogExample(), 208 }) 209 customDialogController.open() 210 ``` 211 212## 使用控制器获取弹出框的状态 213 214在自定义弹出框场景中,可以通过控制器调用getState接口获取弹出框状态。 215 216> **说明:** 217> 218> 详细变量定义请参考[完整示例](#完整示例)。 219 220初始化一个自定义弹出框内容区,内部包含一个Text组件和一个按钮,该按钮通过调用getState获取当前弹出框状态。 221 222 ```ts 223 @Builder customDialogComponent(dialogController: promptAction.DialogController) { 224 Column({ space: 5 }) { 225 Text(this.message) 226 .fontSize(30) 227 if (dialogController !== undefined) { 228 Button('点我查询弹窗状态') 229 .onClick(() => { 230 console.info('state:' + this.dialogController.getState()) 231 }) 232 } 233 } 234 .height(200) 235 .padding(5) 236 .justifyContent(FlexAlign.SpaceBetween) 237 .backgroundColor('#FFF0F0F0') 238 } 239 ``` 240 241## 完整示例 242 243通过外部传递的弹出框控制器和自定义组件自带的弹出框控制器,在自定义弹出框内容区域内实现关闭功能。 244 245 ```ts 246 import { ComponentContent, promptAction } from '@kit.ArkUI' 247 import { BusinessError } from '@kit.BasicServicesKit' 248 249 class Params { 250 public text: string = '' 251 public dialogController: promptAction.CommonController = new promptAction.DialogController() 252 constructor(text: string, dialogController: promptAction.CommonController) { 253 this.text = text 254 this.dialogController = dialogController 255 } 256 } 257 258 @Component 259 struct MyComponent { 260 build() { 261 Column({ space: 5 }) { 262 Button('点我关闭弹窗:通过自定义组件自带的DialogController') 263 .onClick(() => { 264 let dialogController: promptAction.DialogController = this.getDialogController() 265 if (dialogController !== undefined) { 266 dialogController.close() 267 } 268 }) 269 } 270 } 271 } 272 273 @Builder 274 function buildText(params: Params) { 275 Column({ space: 5 }) { 276 Text(params.text) 277 .fontSize(30) 278 if (params.dialogController !== undefined) { 279 Button('点我关闭弹窗:通过外部传递的DialogController') 280 .onClick(() => { 281 params.dialogController.close() 282 }) 283 } 284 MyComponent() 285 } 286 .width(300) 287 .height(200) 288 .backgroundColor('#FFF0F0F0') 289 } 290 291 @CustomDialog 292 @Component 293 struct CustomDialogExample { 294 controller?: CustomDialogController 295 296 build() { 297 Column({ space: 5 }) { 298 Text('我是内容') 299 .fontSize(30) 300 Button('点我关闭弹窗:通过自定义组件自带的DialogController') 301 .onClick(() => { 302 let dialogController: PromptActionDialogController = this.getDialogController() 303 if (dialogController !== undefined) { 304 dialogController.close() 305 } 306 }) 307 } 308 .height(200) 309 .backgroundColor('#FFF0F0F0') 310 } 311 } 312 313 @Entry 314 @Component 315 export struct Index { 316 private message = '弹窗' 317 @Builder customDialogComponent(dialogController: promptAction.DialogController) { 318 Column({ space: 5 }) { 319 Text(this.message) 320 .fontSize(30) 321 if (dialogController !== undefined) { 322 Button('点击关闭弹窗:通过外部传递的DialogController') 323 .onClick(() => { 324 dialogController.close() 325 }) 326 } 327 } 328 .height(200) 329 .padding(5) 330 .justifyContent(FlexAlign.SpaceBetween) 331 .backgroundColor('#FFF0F0F0') 332 } 333 334 @Builder customDialogComponentWithId(dialogId: number, dialogController: promptAction.DialogController) { 335 Column({ space: 5 }) { 336 Text(this.message) 337 .fontSize(30) 338 if (dialogId !== undefined) { 339 Button('点击关闭弹窗:通过DialogID') 340 .onClick(() => { 341 this.getUIContext().getPromptAction().closeCustomDialog(dialogId) 342 }) 343 } 344 if (dialogController !== undefined) { 345 Button('点击关闭弹窗:通过外部传递的DialogController') 346 .onClick(() => { 347 dialogController.close() 348 }) 349 } 350 } 351 } 352 353 private baseDialogOptions: promptAction.BaseDialogOptions = { 354 isModal: false, 355 autoCancel: false 356 } 357 358 private dialogOptions: promptAction.DialogOptions = { 359 isModal: false, 360 autoCancel: false 361 } 362 363 build() { 364 Column({ space: 5 }) { 365 Button('openCustomDialogWithController弹窗') 366 .onClick(() => { 367 let dialogController: promptAction.CommonController = new promptAction.DialogController() 368 let contentNode: ComponentContent<Object> = 369 new ComponentContent(this.getUIContext(), wrapBuilder(buildText), new Params(this.message, dialogController)) 370 this.getUIContext().getPromptAction().openCustomDialogWithController( 371 contentNode, dialogController, this.baseDialogOptions).catch((err: BusinessError) => { 372 console.error('openCustomDialogWithController error: ' + err.code + ' ' + err.message) 373 }) 374 }) 375 Button('presentCustomDialog+CustomBuilder弹窗') 376 .onClick(() => { 377 let dialogController: promptAction.CommonController = new promptAction.DialogController() 378 this.getUIContext().getPromptAction().presentCustomDialog(() => { 379 this.customDialogComponent(dialogController) 380 }, dialogController, this.dialogOptions).catch((err: BusinessError) => { 381 console.error('presentCustomDialog error: ' + err.code + ' ' + err.message) 382 }) 383 }) 384 Button('presentCustomDialog+CustomBuilderWithId弹窗') 385 .onClick(() => { 386 let dialogController: promptAction.CommonController = new promptAction.DialogController() 387 this.getUIContext().getPromptAction().presentCustomDialog((dialogId: number) => { 388 this.customDialogComponentWithId(dialogId, dialogController) 389 }, dialogController, this.dialogOptions).catch((err: BusinessError) => { 390 console.error('presentCustomDialog error: ' + err.code + ' ' + err.message) 391 }) 392 }) 393 Button('CustomDialogController弹窗') 394 .onClick(() => { 395 let customDialogController: CustomDialogController = new CustomDialogController({ 396 builder: CustomDialogExample(), 397 }) 398 customDialogController.open() 399 }) 400 }.width('100%') 401 } 402 } 403 ``` 404 405