目录

弹窗类控件走焦

设计场景

根据用户交互操作场景,弹窗可分为模态弹窗和非模态弹窗两种类型,其区别在于用户是否必须对其做出响应。

支持设置模态类型的弹窗控件包括Popup、Menu、Diaglog、bindSheet。

开发流程

如下示例实现一个模态弹窗和一个非模态弹窗,可以通过点击不同的按钮打开:

@Entry
@Component
export struct Rule_2_1_17 {
  title: string = 'Rule 2.1.17';
  // 模态对话框控制器。
  private modelDialogController: CustomDialogController = this.createDialogController(true);
  // 非模态对话框控制器。
  private nonModelDialogController: CustomDialogController = this.createDialogController(false);

  /**
   * 创建对话框控制器
   * @param isModal 是否为模态对话框
   * @returns 返回创建的对话框控制器
   */
  private createDialogController(isModal: boolean): CustomDialogController {
    return new CustomDialogController({
      builder: CustomDialogExample({
        controller: isModal ? this.modelDialogController : this.nonModelDialogController,
        isModal: isModal,
        cancel: () => {
          if (isModal) {
            this.modelDialogController.close();
          } else {
            this.nonModelDialogController.close();
          }
        }
      }),
      autoCancel: true,
      isModal: isModal,
      onWillDismiss: (dismissDialogAction: DismissDialogAction) => {
        if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
          dismissDialogAction.dismiss();
        }
        if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
          dismissDialogAction.dismiss();
        }
      },
      showInSubWindow: true,
      alignment: DialogAlignment.Center,
      width: 300,
      height: 250,
    })
  }

  build() {
    NavDestination() {
      Scroll() {
        Column() {
          // 模态对话框按钮。
          Button('模态dialog')
            .margin({ bottom: 5 })
            .onClick(() => {
              this.modelDialogController.open();
            })

          // 非模态对话框按钮。
          Button('非模态dialog')
            .onClick(() => {
              this.nonModelDialogController.open();
            })
        }.margin({ bottom: 5 })
      }
    }.title(this.title)
  }
}

@CustomDialog
struct CustomDialogExample {
  // 是否为模态对话框。
  isModal?: boolean;
  // 对话框控制器。
  controller?: CustomDialogController;
  // 关闭对话框的回调函数。
  cancel: () => void = () => {};

  build() {
    Column() {
      // 显示对话框的标题。
      Text(this.isModal ? '模态弹窗' : '非模态弹窗')
        .fontSize(30)
        .height(100)
      Text('测试节点1')
      Text('测试节点2')
      Text('测试节点3')
      // 关闭对话框按钮。
      Button('关闭')
        .onClick(() => {
          this.cancel?.();
        })
        .margin(20)
    }
  }
}