HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?

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

HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?

cke_188.png

使用

@CustomDialog 创建了一个这样的 dialog ,用于选择省市县,现在每次弹窗都会重新生成一个新的,如何持久化的持有这个 dialog 呢?


更多关于HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

弹窗消失,组件肯定是回释放的,不需要持久化去持有,只需要存储下这个弹窗关注的状态,放到外面存储。再次调用弹窗的时候,把这些状态变量传入就行。

参考demo:

@CustomDialog
struct CustomDialogExample {
  controller?: CustomDialogController
  cancel: () => void = () => {
  }
  confirm: () => void = () => {
  }
  @Link SaveClickNum : number
  @State clickNum: number = -1
  aboutToAppear(): void {
    this.clickNum = this.SaveClickNum
  }
  aboutToDisappear(): void {
    this.SaveClickNum = this.clickNum
  }
  private arr:number[] = [0,1,2,3,4,5]

  build() {
    Column() {
      Text("请选择").fontSize(30)
      Scroll() {
        List() {
          ForEach(this.arr, (item: number) => {
            ListItem(){
              Text("chose" + item)
                .fontSize(15)
                .fontColor(item == this.clickNum ? Color.Blue : Color.Black)
            }.onClick(()=>{
              this.clickNum = item
            })
            .backgroundColor(item == this.clickNum ? Color.Orange : Color.White)
          })
        }
      }
      Button('点我关闭弹窗')
        .onClick(() => {
          if (this.controller != undefined) {
            this.controller.close()
          }
        })
        .margin(20)
    }
  }
}
@Entry
@Component
struct CustomDialogUser {
  @State clickNum: number = -1
  aboutToAppear(): void {
  }

  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: ()=> { this.onCancel() },
      confirm: ()=> { this.onAccept() },
      SaveClickNum: this.clickNum
    }),
    cancel: this.existApp,
    autoCancel: true,
    onWillDismiss:(dismissDialogAction: DismissDialogAction)=>{
      console.info("reason=" + JSON.stringify(dismissDialogAction.reason))
      console.log("dialog onWillDismiss")
      if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
        dismissDialogAction.dismiss()
      }
      if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
        dismissDialogAction.dismiss()
      }
    },
    alignment: DialogAlignment.Center,
    offset: { dx: 0, dy: -20 },
    gridCount: 4,
    showInSubWindow: true,
    isModal: true,
    customStyle: false,
    cornerRadius: 10,
  })
  // 在自定义组件即将析构销毁时将dialogController置空
  aboutToDisappear() {
    this.dialogController = null // 将dialogController置空
  }

  onCancel() {
    console.info('Callback when the first button is clicked')
  }

  onAccept() {
    console.info('Callback when the second button is clicked')
  }

  existApp() {
    console.info('Click the callback in the blank area')
  }

  build() {
    Column() {
      Button('click me')
        .onClick(() => {
          if (this.dialogController != null) {
            this.dialogController.open()
          }
        }).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}

更多关于HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,持久化弹窗的需求可以通过管理弹窗的生命周期和状态来实现,而不是直接“持久化”一个UI组件。鸿蒙系统提供了丰富的UI框架和组件管理机制,允许开发者控制组件的显示与隐藏,而不是每次都重新创建。

要实现这一功能,你可以采取以下策略:

  1. 单例模式:确保应用中弹窗实例的唯一性,通过单例模式管理弹窗的创建和显示。

  2. 状态管理:利用鸿蒙的状态管理机制(如数据绑定、ViewModel等),根据应用状态控制弹窗的显示与隐藏。

  3. 页面栈管理:如果弹窗是作为页面存在,可以通过页面栈管理其生命周期,避免重复创建。

  4. 自定义组件:将弹窗封装为自定义组件,通过组件的状态控制其显示,而不是销毁和重建。

在具体实现时,你可以根据弹窗的复杂性和使用场景选择合适的方法。例如,对于简单的提示框,可以通过单例模式和状态管理轻松实现;对于复杂的弹窗页面,则可能需要结合页面栈和自定义组件来实现。

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

回到顶部