在HarmonyOS鸿蒙Next中,tabs里面的某一个tabcontent里面有一个弹窗,弹窗上面有个按钮在里面点击跳转到别的页面,此时关闭弹窗,再回来的时候需要弹窗打开,这种怎么处理?

在HarmonyOS鸿蒙Next中,tabs里面的某一个tabcontent里面有一个弹窗,弹窗上面有个按钮在里面点击跳转到别的页面,此时关闭弹窗,再回来的时候需要弹窗打开,这种怎么处理?

3 回复
import router from '@ohos.router';

@CustomDialog
struct dialog_1 {
  controller?: CustomDialogController
  @State num: number = 1

  build() {
    Column() {
      Button("跳转").onClick(() => {
        this.controller?.close()
        router.pushUrl({
          url: "pages/Index",
        })
        this.controller?.close()
      })
      Text(this.num.toString())
      Button("关闭").onClick(() => {
        this.controller?.close()
        //this.num++
        //this.controller?.open()
      })
    }
  }
}

@Entry
@Component

struct Index {

  @State flag: boolean = false
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: dialog_1()
  })
  onPageShow(): void {
    if (this.dialogController != null && this.flag) {
      this.dialogController.open()
    }
  }
  onPageHide(): void {
    if (this.dialogController != null) {
      this.dialogController.close()
    }
  }
  build() {
    Column() {
      Button('第一个页面').onClick(() => {
        if (this.dialogController != null) {
          this.flag = true
          this.dialogController.open()
        }
      })
    }
    .width('100%')
    .height('100%')
  }
  jumpPage() {
    router.pushUrl({
      url: 'pages/Index'
    })
  }
  onConfirm() {
    console.info('------>onConfirm is clicked')
  }
  onCancel() {
    console.info('------>onCancel is clicked')
  }
  aboutToDisappear(): void {
    this.dialogController = null
  }
}

可以这样解决

更多关于在HarmonyOS鸿蒙Next中,tabs里面的某一个tabcontent里面有一个弹窗,弹窗上面有个按钮在里面点击跳转到别的页面,此时关闭弹窗,再回来的时候需要弹窗打开,这种怎么处理?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,可以通过@State@Link装饰器来管理弹窗的显示状态。在跳转页面时,保存弹窗的打开状态,返回时根据保存的状态重新打开弹窗。具体实现可以在onPageShow生命周期中检查状态并控制弹窗显示。

在HarmonyOS Next中处理这种场景,可以通过状态管理来实现。以下是解决方案:

  1. 使用AppStorage或LocalStorage保存弹窗状态:
// 保存弹窗状态
AppStorage.SetOrCreate('isDialogShow', true);

// 获取状态
let isShow = AppStorage.Get('isDialogShow');
  1. 在tab页面的aboutToAppear生命周期中恢复状态:
aboutToAppear() {
  this.isShowDialog = AppStorage.Get('isDialogShow');
}
  1. 弹窗组件绑定状态变量:
@CustomDialog
struct MyDialog {
  @Link isShow: boolean
  
  build() {
    // 弹窗内容
    Button('跳转')
      .onClick(() => {
        router.pushUrl({...});
        this.isShow = false; // 关闭弹窗
      })
  }
}
  1. 在tab页面中使用:
@Entry
@Component
struct TabPage {
  @State isShowDialog: boolean = false
  
  build() {
    Column() {
      // tab内容
      Button('打开弹窗')
        .onClick(() => {
          this.isShowDialog = true;
          AppStorage.SetOrCreate('isDialogShow', true);
        })
      
      // 显示弹窗
      if (this.isShowDialog) {
        MyDialog({ isShow: $isShowDialog })
      }
    }
  }
}

这样当用户返回页面时,可以从存储中恢复弹窗状态,保持界面一致性。

回到顶部