HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决
HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决
【问题现象】
子窗口调用router.back返回上一页面无响应。
【背景知识】
Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。页面跳转是开发过程中的一个重要组成部分。在使用应用程序时,通常需要在不同的页面之间跳转。(现在推荐使用组件导航 (Navigation)(推荐)替换router)。
【定位思路】
可以从以下几种情况进行问题定位:
- router.back()中是否传递参数,若有参数,请查看是否更改路径;若无参数默认转跳到上一页;
- 是否是router.back({ url: ’ / ’ })写法,若url设置为特殊值"/"时不生效;
- 之前跳转是否使用的router.replaceUrl(),replaceUrl会销毁被替换的页面。若是请修改为router.push();
- router.back() 会返回到上一个页面,即上一个页面在页面栈中的位置。但是,上一个页面必须存在于页面栈中才能够返回,否则该方法将无效。
具体内容请看:router.back。
【解决方案】
子窗口和主窗口是两个独立的路由栈,子窗口中使用router.back()只能返回到子窗口的上一页。
若需要子窗口跳转到主窗口,需要在子窗口中获取主窗口的路由栈之后进行跳转。
案例如下:
- 在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) ?? '');
})
}
- 在子窗口的页面中获取到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
更多关于HarmonyOS鸿蒙Next中子窗口router.back返回上一页面无响应,如何定位解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
子窗口和主窗口的路由跳转
子窗口和主窗口是两个独立的路由栈,子窗口中使用router.back()
只能返回到子窗口的上一页。若需要子窗口跳转到主窗口,需要在子窗口中获取主窗口的路由栈之后进行跳转。具体步骤如下:
- 在
entryAbility
中通过AppStorage
存储windowStage
实例。 - 在子窗口的页面中获取
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%')
}
}