HarmonyOS 鸿蒙Next:如何让dialog在隐藏后重新展示时数据不消失

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

HarmonyOS 鸿蒙Next:如何让dialog在隐藏后重新展示时数据不消失 如何让dialog在隐藏的情况下,在展示时,数据不消失

3 回复

看以下demo是否能满足要求:

// xxx.ets
@CustomDialog
@Component
struct CustomDialogExample {
  @Link textValue: string
  @Link inputValue: string
  controller?: CustomDialogController
  cancel: () => void = () => {
  }
  confirm: () => void = () => {
  }

  build() {
    Column() {
      Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
      TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
        .onChange((value: string) => {
          this.textValue = value
        })
      Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('cancel')
          .onClick(() => {
            if (this.controller != undefined) {
              this.controller.close()
              this.cancel()
            }
          }).backgroundColor(0xffffff).fontColor(Color.Black)
        Button('confirm')
          .onClick(() => {
            if (this.controller != undefined) {
              this.inputValue = this.textValue
              this.controller.close()
              this.confirm()
            }
          })
          .backgroundColor(0xffffff)
          .fontColor(Color.Red)
      }
      .margin({ bottom: 10 })
    }
    .borderRadius(10)
  }
}

@Entry
@Component
struct CustomDialogUser {
  @State textValue: string = ''
  @State inputValue: string = 'click me'
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: () => { this.onCancel() },
      confirm: () => { this.onAccept() },
      textValue: $textValue,
      inputValue: $inputValue
    }),
    cancel: this.exitApp,
    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.Bottom,
    offset: { dx: 0, dy: -20 },
    gridCount: 4,
    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')
  }

  exitApp() {
    console.info('Click the callback in the blank area')
  }
  build() {
    Column() {
      Button(this.inputValue)
        .onClick(() => {
          if (this.dialogController != null) {
            this.dialogController.open()
          }
        }).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}

更多关于HarmonyOS 鸿蒙Next:如何让dialog在隐藏后重新展示时数据不消失的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


数据持久化保存

在HarmonyOS鸿蒙系统中,若想让Dialog在隐藏后重新展示时数据不消失,可以采取以下策略:

  1. 保存Dialog状态:在Dialog隐藏前,将Dialog中显示的数据(如文本、选择项等)保存到某个全局变量或数据结构中。当Dialog重新展示时,从这些保存的数据中恢复Dialog的状态。

  2. 使用自定义Dialog:如果标准Dialog组件无法满足需求,可以创建一个自定义Dialog,通过继承Dialog类或在Dialog的布局文件中定义自定义视图来实现。在自定义Dialog中,可以更好地控制数据的保存和恢复逻辑。

  3. 利用Fragment替代Dialog:在某些情况下,可以考虑使用Fragment来替代Dialog。Fragment具有更强大的生命周期管理功能,可以更容易地保存和恢复状态。当需要显示Dialog时,将Fragment添加到Activity中;当需要隐藏Dialog时,将Fragment从Activity中移除,但保留其状态。

  4. 确保数据持久化:如果Dialog中的数据非常重要,可以考虑将数据持久化到存储介质(如文件、数据库等)。这样,即使应用被关闭或重启,数据也能被恢复。

请注意,以上策略需要根据具体的应用场景和需求来选择和实现。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部