HarmonyOS鸿蒙Next中在arkts类中想调用自定义弹窗

HarmonyOS鸿蒙Next中在arkts类中想调用自定义弹窗 在类的方法用promptAction.openCustomDialog,把build写在类外面试了不行,会闪退。

3 回复

参考如下demo:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/js-apis-arkui-UIContext.md#opencustomdialog12

全局封装弹窗的案例:https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/customdialog/README.md

参考demo:

import { promptAction } from '@kit.ArkUI';

export class GlobalContext {
  private constructor() {}

  private static instance: GlobalContext;
  private _objects = new Map<string, Object>();

  public static getContext(): GlobalContext {
    if (!GlobalContext.instance) {
      GlobalContext.instance = new GlobalContext();
    }
    return GlobalContext.instance;
  }

  getObject(value: string): Object | undefined {
    return this._objects.get(value);
  }

  setObject(key: string, objectClass: Object): void {
    this._objects.set(key, objectClass);
  }
}

let customDialogId: number = 0

@Builder
export function customDialogBuilder(content: String) {
  Column() {
    Text('弹窗').fontSize(20).height("30%")

    Text('失败原因:失败原因!').fontSize(16).height("30%")

    Row() {
      Button("确认").onClick(() => {
        promptAction.closeCustomDialog(customDialogId)
      })

      Blank().width(50)

      Button("取消").onClick(() => {
        promptAction.closeCustomDialog(customDialogId)
      })
    }
    .margin({ top: 30 })
  }
  .height(200).padding(5)
}

export function testPromptDialog() {
  const that = GlobalContext.getContext().getObject('UIContext') as UIContext;

  if (that) {
    promptAction.openCustomDialog({
      builder: customDialogBuilder.bind(that, "网络请求失败!")
    })
    .then((dialogId: number) => {
      customDialogId = dialogId;
    })
  }
}

@Entry
@Component
struct hwmPage {
  aboutToAppear(): void {
    GlobalContext.getContext().setObject('UIContext', this)
  }

  build() {
    Row() {
      Column() {
        Button("promptAction弹窗")
          .onClick(() => {
            testPromptDialog()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中在arkts类中想调用自定义弹窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,如果你想在ArkTS类中调用自定义弹窗,可以通过使用@CustomDialog装饰器来定义自定义弹窗组件,然后在ArkTS类中通过controller.show()方法来显示弹窗。

首先,定义自定义弹窗组件:

@CustomDialog
struct MyCustomDialog {
  controller: CustomDialogController
  build() {
    Column() {
      Text('This is a custom dialog')
      Button('Close').onClick(() => {
        this.controller.close()
      })
    }
  }
}

然后,在ArkTS类中调用自定义弹窗:

class MyClass {
  private dialogController: CustomDialogController = new CustomDialogController({
    builder: MyCustomDialog(),
    cancel: () => {
      console.log('Dialog canceled')
    },
    autoCancel: true
  })

  showDialog() {
    this.dialogController.show()
  }
}

MyClass中,你可以通过调用showDialog方法来显示自定义弹窗。CustomDialogController用于控制弹窗的显示和关闭。

在HarmonyOS鸿蒙Next中,使用ArkTS调用自定义弹窗的步骤如下:

  1. 创建自定义弹窗组件:使用@CustomDialog装饰器定义一个弹窗组件,并在build方法中编写UI布局。

  2. 在业务类中调用弹窗:通过CustomDialogController实例化弹窗,并调用open()方法显示弹窗。

例如:

@CustomDialog
struct MyDialog {
  // 弹窗内容
}

class MyClass {
  private dialogController: CustomDialogController = new CustomDialogController({
    builder: MyDialog(),
  });

  showDialog() {
    this.dialogController.open();
  }
}

通过showDialog()方法即可触发自定义弹窗显示。

回到顶部