HarmonyOS 鸿蒙Next 弹窗复用问题

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 弹窗复用问题

下面这个弹窗的代码我想去复用,所有把他定义在了一个class对象里,但是CustomDialogController仅在作为@CustomDialog@Component struct的成员变量,且在@Component struct内部定义时赋值才有效,否则弹窗弹不出来,有什么方法可以复用吗 而不是在每个组件使用的时候去copy 代码
model: MaterialDialog.Model = new MaterialDialog.Model();
dialogAttribute = new DialogAttributeModel()
dialogController: CustomDialogController = new CustomDialogController({
builder: MaterialDialog({ model: this.model, dialogAttribute: this.dialogAttribute }),
cancel: this.existDialog,
autoCancel: true,
alignment: this.model.dialogAligmentType,
customStyle: true
})

existDialog() {
console.info(‘Click the callback in the blank area’)
this.dialogController.close()
}

showCustomDialog(context: common.UIAbilityContext, goSettingMessage: string) {
this.model.title($r(“app.string.useOhosLocationServices”))
this.model.message(goSettingMessage)
this.model.positiveButton($r(‘app.string.agree’), () => {
context.startAbility({
bundleName: ‘com.huawei.hmos.settings’,
abilityName: ‘com.huawei.hmos.settings.MainAbility’,
uri: ‘application_info_entry’,
parameters: {
// 应用包名
pushParams: ‘com.foundersc.harm.xf’
}
})
})
this.model.negativeButton($r(‘app.string.disagree’), () => {
})
this.model.dialogAligmentType = DialogAlignment.Center
this.dialogController = new CustomDialogController({
builder: MaterialDialog({ model: this.model, dialogAttribute: this.dialogAttribute }),
cancel: this.existDialog,
autoCancel: true,
alignment: this.model.dialogAligmentType,
customStyle: true
})
this.dialogController.open()
}


更多关于HarmonyOS 鸿蒙Next 弹窗复用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

定义在class类里面,目前是不支持的。可以使用ohos.promptAction提供的弹窗组件,将弹窗内容封装成Builder单独放在arkts文件中。使用时import。 参考demo:

import { BusinessError } from '@ohos.base';

import { ComponentContent } from "@ohos.arkui.node";

class Params {

  text: string = ""

  constructor(text: string) {

    this.text = text;

  }

}//传参

@Builder

function buildText(params: Params) {

  Row(){

    Column() {

      Text(params.text)

        .fontSize(50)

        .fontWeight(FontWeight.Bold)

        .margin({bottom: 36})

    }.backgroundColor('#FFF0F0F0')

  }

  .height("100%")

} //自定义组件的内容

@Entry

@Component

struct Index {

  @State message: string = "显示TOAST"

  build() {

    Row() {

      Column() {

        Button("click me")

          .onClick(() => {

            let uiContext = this.getUIContext();

            let promptAction = uiContext.getPromptAction();

            let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(this.message));//上下文、自定义节点、传参

            try {

              promptAction.openCustomDialog(contentNode);

            } catch (error) {

              let message = (error as BusinessError).message;

              let code = (error as BusinessError).code;

              console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);

            };

          })

      }

      .width('100%')

      .height('100%')

    }

    .height('100%')

  }

}

更多关于HarmonyOS 鸿蒙Next 弹窗复用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next弹窗复用问题,以下是一些可能的解决方案:

一、弹窗复用方法

  1. 创建子窗口:可以通过创建子窗口的方式实现弹窗复用。在EntryAbility中,使用AppStorage缓存windowStage,并在需要时通过windowStage创建子窗口。子窗口创建成功后,可以设置其位置、大小及相关属性,并加载对应的目标页面作为弹窗内容。
  2. 使用Stack布局:为了避免弹窗无法保持在目标页面或无法控制展示优先级的问题,可以使用Stack布局形式改造页面结构,统一管理弹窗组件,通过状态变量控制弹窗的显隐。

二、注意事项

  1. 确保在请求弹窗前,应用已获得必要的上下文和生命周期回调。
  2. 验证弹窗相关的权限列表是否正确,并符合HarmonyOS的权限管理要求。
  3. 如果弹窗无法弹出,可能是由于系统权限弹窗的模态化窗口级别较高导致,此时需要调整弹窗的级别或检查是否有其他弹窗正在显示。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部