HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决

HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决

【问题现象】

子窗口调用router.back返回上一页面无响应。

【背景知识】

Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。页面跳转是开发过程中的一个重要组成部分。在使用应用程序时,通常需要在不同的页面之间跳转。(现在推荐使用组件导航 (Navigation)(推荐)替换router)。

【定位思路】

可以从以下几种情况进行问题定位:

  1. router.back()中是否传递参数,若有参数,请查看是否更改路径;若无参数默认转跳到上一页;
  2. 是否是router.back({ url: ’ / ’ })写法,若url设置为特殊值"/"时不生效;
  3. 之前跳转是否使用的router.replaceUrl(),replaceUrl会销毁被替换的页面。若是请修改为router.push();
  4. router.back() 会返回到上一个页面,即上一个页面在页面栈中的位置。但是,上一个页面必须存在于页面栈中才能够返回,否则该方法将无效。

具体内容请看:router.back

【解决方案】

点击放大

子窗口和主窗口是两个独立的路由栈,子窗口中使用router.back()只能返回到子窗口的上一页。

若需要子窗口跳转到主窗口,需要在子窗口中获取主窗口的路由栈之后进行跳转。

案例如下:

  1. 在entryAbility中通过AppStorage存windStage实例。
onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  AppStorage.setOrCreate<window.WindowStage>('stage',windowStage)
  windowStage.loadContent('pages/Page', (err, data) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return; 
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
  })
}
  1. 在子窗口的页面中获取到windowStage,然后通过windowStage获取到主窗口,依次获取到主窗口的UIContext对象,Router对象,最后进行跳转。

参考代码:子窗口加载的Page页。

import window from '@ohos.window'

@Entry
@Component
struct Page1 {
  @State message: string = 'WindowPage'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .backgroundColor(Color.Blue)
          .onClick(() => {
            AppStorage.get<window.WindowStage>("stage")?.getMainWindowSync()
              .getUIContext()
              .getRouter()
              .pushUrl({
                url: "pages/PageB"
              })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

【总结】

子窗口和主窗口是两个独立的路由栈,子窗口中使用router.back()只能返回到子窗口的上一页。

若需要子窗口跳转到主窗口,需要在子窗口中获取主窗口的路由栈之后进行跳转。


更多关于HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


子窗口和主窗口的路由跳转

子窗口和主窗口是两个独立的路由栈,子窗口中使用router.back()只能返回到子窗口的上一页。若需要子窗口跳转到主窗口,需要在子窗口中获取主窗口的路由栈之后进行跳转。具体步骤如下:

  1. entryAbility中通过AppStorage存储windowStage实例。
  2. 在子窗口的页面中获取windowStage,然后通过windowStage获取到主窗口,依次获取到主窗口的UIContext对象和Router对象,最后进行跳转。

参考代码

import window from '@ohos.window'

@Entry
@Component
struct Page1 {
  @State message: string = 'WindowPage'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .backgroundColor(Color.Blue)
          .onClick(() => {
            AppStorage.get<window.WindowStage>("stage")?.getMainWindowSync()
              .getUIContext()
              .getRouter()
              .pushUrl({
                url: "pages/PageB"
              })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
回到顶部