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%")
  }
}
HarmonyOS
2天前
浏览
收藏 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)
分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS 自定义dialog封装后全局调用
143浏览 • 1回复 待解决
如何在全局实现一个自定义dialog弹窗
3007浏览 • 1回复 待解决
HarmonyOS 自定义Dialog宽度
230浏览 • 1回复 待解决
HarmonyOS 自定义全屏dialog
203浏览 • 1回复 待解决
HarmonyOS 全局自定义字体
229浏览 • 1回复 待解决
HarmonyOS 全局自定义字体
225浏览 • 1回复 待解决
HarmonyOS 如何封装自定义Dialog
173浏览 • 1回复 待解决
HarmonyOS 自定义dialog相关问题
184浏览 • 1回复 待解决
HarmonyOS 自定义Dialog显示问题
697浏览 • 1回复 待解决
HarmonyOS 自定义dialog open无效
405浏览 • 1回复 待解决
HarmonyOS 用CustomDialog自定义Dialog
456浏览 • 1回复 待解决
HarmonyOS 自定义Dialog高度问题
171浏览 • 1回复 待解决
HarmonyOS 使用全局自定义弹窗
168浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗demo
476浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗无法弹出
203浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗的实现
166浏览 • 1回复 待解决
HarmonyOS 如何创建自定义全局弹窗
129浏览 • 1回复 待解决
HarmonyOS 全局设置自定义字体的方法
158浏览 • 1回复 待解决
鸿蒙怎么实现自定义布局的Dialog
9361浏览 • 2回复 已解决