• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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![dialog-controller-demo1](figures/dialog-controller-demo1.gif)
405