HarmonyOS 自定义全局dialog

想做一个全局通用的dialog,发现弹层效果和弹出内的UI层(也就是builder)必须要分开写,一点通用性和可复用性也没有。

退而求其次,弹层设置和内容UI层各自封装。在使用的地方在组装。发现dialogID无法传到UI层,请问我要怎么关闭这个碳层。

@Builder
function dialogCustomView(n: number) {
  Column() {
    Text("这里是标题")
    Text("这里是描述, 当前弹窗id:" + n)
    Row() {
      Button("取消").onClick(() => {
        promptAction.closeCustomDialog(n);
      })
      Button("确定")
    }
  }
  .width("100%")
}


@Preview
@Entry
@Component
struct DialogExample {
  @State dialogId: number = 0;

  @Builder
  dialogCustomView() {
    dialogCustomView(this.dialogId)
  }

  async show() {
    this.dialogId = await promptAction.openCustomDialog({
      builder: () => this.dialogCustomView(),
      backgroundColor: "#fff",
      maskColor: "rgba(0,0,0,0.6)",
      autoCancel: false
    })
  }

  build() {
    Column() {
      Button("点击弹窗").onClick(() => {
        this.show();
      })
    }.width("100%").height("100%")
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
HarmonyOS
2025-01-09 14:29:04
497浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
shlp

自定义全局弹框可以参考下述demo:

//1:
onWindowStageCreate(windowStage: window.WindowStage): void {
  //在EntryAbility的onWindowStageCreate方法里通过AppStorage定义关于弹框显示的全局属性,默认false不显示
  AppStorage.setOrCreate('showGlobalCustomDialog', false)
  //通过AppStorage定义弹窗显示文本
  AppStorage.setOrCreate('showLoadingText', "请稍候...")
}

  //2:
import { CustomLoading } from '../pages/CustomLoading'
import { router } from '@kit.ArkUI'

@Entry
@Component
struct CustomDialogPage {
  //自定义弹窗是否显示
  @StorageLink('showGlobalCustomDialog') @Watch('globalCustomDialogStateChange') showGlobalCustomDialog: boolean = false
  @StorageLink('showLoadingText') text: string = ""
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomLoading({text: this.text}),
    alignment: DialogAlignment.Center,
    autoCancel:false,
    customStyle:true,
    cancel:(() => {
      AppStorage.setOrCreate('showGlobalCustomDialog', false)
    })
  })
  globalCustomDialogStateChange() {
    if (this.showGlobalCustomDialog) {
      if (this.dialogController != null) {
        this.dialogController.open()
      }
    }else{
      this.dialogController?.close()
    }
  }

  build() {

  }
}

//3:
@CustomDialog
export struct CustomLoading {
  controller?: CustomDialogController
  @Prop text: string;
  build() {
    Stack({ alignContent: Alignment.Center }) {
      Column() {
        LoadingProgress().width(30).height(30).color(Color.White)
        Text(this.text)
          .fontColor(Color.White)
          .fontSize(16)
          .margin({ top: 15 })
          .width('100%')
          .textAlign(TextAlign.Center)
      }
      .justifyContent(FlexAlign.Center)
      .width(100)
      .height(100)
      .backgroundColor('#88000000')
      .borderRadius(10)
    }
    .width('100%')
    .height('100%')
    .backgroundColor(Color.Transparent)
  }
}

//4:显示弹窗并修改文本
AppStorage.setOrCreate('showLoadingText', "测试中...")
AppStorage.setOrCreate('showGlobalCustomDialog', true)
//隐藏 
AppStorage.setOrCreate('showGlobalCustomDialog', false)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
分享
微博
QQ
微信
回复
2025-01-09 17:35:39


相关问题
HarmonyOS 自定义dialog封装后全局调用
665浏览 • 1回复 待解决
如何在全局实现一个自定义dialog弹窗
3451浏览 • 1回复 待解决
HarmonyOS 自定义Dialog宽度
751浏览 • 1回复 待解决
HarmonyOS 自定义全屏dialog
775浏览 • 1回复 待解决
HarmonyOS 全局自定义字体
709浏览 • 1回复 待解决
HarmonyOS 全局自定义字体
664浏览 • 1回复 待解决
HarmonyOS 自定义dialog相关问题
643浏览 • 1回复 待解决
HarmonyOS 如何封装自定义Dialog
686浏览 • 1回复 待解决
HarmonyOS 自定义Dialog显示问题
1136浏览 • 1回复 待解决
HarmonyOS 自定义dialog open无效
869浏览 • 1回复 待解决
HarmonyOS 自定义Dialog高度问题
628浏览 • 1回复 待解决
HarmonyOS 用CustomDialog自定义Dialog
1001浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗demo
1083浏览 • 1回复 待解决
HarmonyOS 使用全局自定义弹窗
681浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗无法弹出
740浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗的实现
787浏览 • 1回复 待解决
HarmonyOS 自定义Dialog背景色透明问题
1766浏览 • 1回复 待解决
鸿蒙怎么实现自定义布局的Dialog
9900浏览 • 2回复 已解决
HarmonyOS 全局设置自定义字体的方法
599浏览 • 1回复 待解决
HarmonyOS 如何创建自定义全局弹窗
646浏览 • 1回复 待解决