HarmonyOS 鸿蒙Next没法封装自定义弹窗?CustomDialogController不能写在class类中

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

HarmonyOS 鸿蒙Next没法封装自定义弹窗?CustomDialogController不能写在class类中
<markdown _ngcontent-qlo-c237="" class="markdownPreContainer">

@CustomDialog自定义弹窗内容,旨在显示loading转圈

[@CustomDialog](/user/CustomDialog)
struct LoadingHUD {
  private text?: string
  controller: CustomDialogController = new CustomDialogController({
    builder: LoadingHUD(),
  })

  build() {
    Column() {
      LoadingProgress()
        .width('50vp')
        .height('50vp')
      if (this.text) {
        Text(this.text)
      }
    }
  }
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

一般很多地方都要用到loading转圈蒙层,如果每个页面都要写一串CustomDialogController的初始化,那也太麻烦了,如下:

[@Component](/user/Component)
struct LoginPage {

dialogController: CustomDialogController = new CustomDialogController({ builder: LoadingHUD({ text: ‘登录中’ }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, cancel: () => {

}

})

build() { Column() { … Button(‘登录’) .onClick(() => { this.dialogController.open() }) … } .width(‘100%’).height(‘100%’) } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

想在自定义类里面封装CustomDialogController,虽然编译不报错,但是调用ProgressHUD.dialogController.open()却毫无反应。 想继承CustomDialogController类更会导致程序崩溃,真莫名其妙。

class ProgressHUD {
  // 自定义弹窗controller
  private static dialogController: CustomDialogController = new CustomDialogController({
    builder: LoadingHUD({ text: this._text }),
    alignment: DialogAlignment.Center,
    autoCancel: true,
    customStyle: true,
    cancel: () => {
}

}) private static _text?: string

static showLoading(text?: string) { ProgressHUD._text = text ProgressHUD.dialogController.open() }

static close() { ProgressHUD.dialogController.close() } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

鸿蒙封装组件太难了,很多应该支持的却不支持,有时候要绕多次弯才能勉强实现,有些场景却怎么也实现不了,设计真是一言难尽,做鸿蒙开发太难了。

</markdown>
14 回复
文档中已说明:CustomDialogController仅在作为[@CustomDialog](/user/CustomDialog)和[@Component](/user/Component) struct的成员变量,且在[@Component](/user/Component) struct内部定义时赋值才有效

是的,这个我有看到。我就是吐槽这个限制,限制了我们封装公共组件。

可以创建一个 subWindow,  然后 loading 的内容视图都放到单独的页面,控制好 window 的显示和隐藏就可以了,还能支持非 page 页面显示和隐藏
鸿蒙这个系统完全就没有封装的思想,所有东西都是堆代码
和小程序类似,目前来说很多功能不能得到实现
不能封装的代码太丑了
我是为了Web侧加载应用侧等待层这样写的,遇到了同样的问题。太难了吧,目前有解决办法吗。

你好,请问你web侧调用原生弹框成功了吗

api 12 支持全局弹窗了

哪里可以看到指南

设计的太恶心了

可以封装,这样封装:

export default function IOSActionSheet(sheets:Sheet[]):CustomDialogController{
return new CustomDialogController({
alignment: DialogAlignment.Bottom,
customStyle:true,
offset:{dx:0, dy: -30},
maskColor:"#88000000",
builder: IOSActionSheetView({
sheets
})
});
}

调用的时候要注意.bind(this):

let as:CustomDialogController = IOSActionSheet.bind(this)([{
title:'拷贝本条',
action: async (t:string)=>{
let pasteData: pasteboard.PasteData =
pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, d.rtext);
await pasteboard.getSystemPasteboard().setData(pasteData);
promptAction.showToast({
message: '已复制到剪贴板!'
})
as.close();
}
},{
title:'拷贝本章全部内容',
action: (t:string)=>{}
},{
title:'拷贝全部结果',
action: (t:string)=>{}
}]);
as.open();
})
封装的确太差了,各种限制也是莫名其妙,很像Flutter,但完全没有flutter灵活

在HarmonyOS(鸿蒙)系统中,如果你遇到CustomDialogController不能直接在class类中定义的问题,这通常是因为你可能没有正确设置其上下文环境或者该类没有被正确地继承或实现必要的接口。确保你的类继承自合适的DialogController基类,并在构造函数中正确传递了Activity的Context。

同时,检查你的CustomDialogController类中是否包含了所有必要的生命周期和UI构建逻辑。如果CustomDialogController是自定义的,请确保它的实现符合鸿蒙系统的UI框架规范。

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部