HarmonyOS 鸿蒙Next CustomDialogController 弹出多次如何修改每次的offset

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next CustomDialogController 弹出多次如何修改每次的offset
尝试下面的代码,无法生效。

@State
dialogOffset?:Offset = undefined

controller: CustomDialogController = new CustomDialogController({
builder: MyDialog(),
alignment: DialogAlignment.CenterStart,
offset:this.dialogOffset
})


// 这个方面会多次调用
openDialog() {

this.dialogOffset = xxx // <==== 这里每次都会更新值不一样

this.controller.open()
}
}

尝试每次都new CustomDialogController 会提示

Error message:is not callable
Stacktrace:
at SynchedPropertyTwoWayPU (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4515:4515)
at SynchedPropertyObjectTwoWayPU (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:0:1)
at MyDialog
at builder

更多关于HarmonyOS 鸿蒙Next CustomDialogController 弹出多次如何修改每次的offset的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

目前自定义弹窗的所有参数,暂不支持动态刷新。

可以先参考以下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) {

  Column() {

    Text(params.text)

      .fontSize(50)

      .fontWeight(FontWeight.Bold)

      .margin({bottom: 36})

  }.backgroundColor('#FFF0F0F0')

}

@Entry

@Component

struct Index {

  @State message: string = "hello"

  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});

            };

            setTimeout(() =&gt; {

              try {

                promptAction.updateCustomDialog(contentNode, { alignment: DialogAlignment.CenterEnd });

              } catch (error) {

                let message = (error as BusinessError).message;

                let code = (error as BusinessError).code;

                console.error(updateCustomDialog args error code is ${code}, message is ${message});
              };
            },2000);   //2&#31186;&#21518;&#33258;&#21160;&#26356;&#26032;&#24377;&#31383;&#20301;&#32622;

          })
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

具体可参考链接如下: https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/js-apis-arkui-UIContext.md#updatecustomdialog12

demo中的updateCustomDialog可以更新已弹出的dialogContent对应的自定义弹窗的样式,demo中具体效果是点击按钮弹出弹窗,2秒后自动更新弹窗位置,要用最新版本运行。

更多关于HarmonyOS 鸿蒙Next CustomDialogController 弹出多次如何修改每次的offset的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,如果你在使用Next CustomDialogController时遇到弹出多次且需要修改每次弹出的offset问题,可以通过以下方式实现:

  1. 维护弹出次数与偏移量: 在代码中维护一个变量来记录弹出的次数,每次弹出时根据该变量动态计算或设置offset

  2. 在Dialog显示前设置Offset: 在调用showDialog或相关显示方法之前,根据当前的弹出次数更新Dialog的偏移量属性(如setGravity配合setXYOffset,或根据Dialog的布局参数直接设置)。

  3. 确保每次创建新Dialog实例: 如果每次弹出的是同一个Dialog实例,修改其偏移量可能不会生效。确保每次弹出时都创建一个新的CustomDialogController实例,并在创建时设置相应的偏移量。

  4. 示例代码(伪代码,具体实现需根据实际项目调整):

    int dialogCount = 0;
    dialogCount++;
    CustomDialogController dialog = new CustomDialogController(context);
    // 根据dialogCount设置偏移量
    dialog.setXYOffset((int)(dialogCount * 50), 0); // 示例:每次垂直偏移增加50
    dialog.showDialog();
    

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

回到顶部