HarmonyOS 鸿蒙Next中两个页面路由跳转问题
HarmonyOS 鸿蒙Next中两个页面路由跳转问题
有两个页面a和b
a跳转到b的过程的生命周期预期是a先执行onpagehide或者b先执行onpageshow,但是a的onpagehide一定要执行;
然后从b返回到a,a要执行onpageshow;
但是事实上a到b,a的onpagehide不执行;
b到a,a的onpageshow不执行;
麻烦问下这个是什么原因造成的,都是用@Entry装饰的组件。
【问题现象】
Navigation跳转至NavDestination页面跳转无法触发onPageShow、onPageHide、onBackPress等生命周期回调函数,如何监听页面的显示隐藏?
【背景知识】
Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件)。
[@ohos.arkui.observer(无感监听)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-arkui-observer)提供UI组件行为变化的无感监听能力。如页面生命周期、组件显隐状态、滚动事件等。其中uiObserver.on(‘navDestinationSwitch’)可以监听Navigation的页面切换事件并执行自定义操作。
【解决方案】
使用Navigation跳转的页面不会走onPageShow生命周期,onPageShow、onPageHide、onBackPress等生命周期回调函数,仅对@Entry装饰的自定义组件生效,NavDestination提供了onShown、onHidden、onBackPressed等属性可以设置对应的回调函数,通过这些属性监听页面的显示隐藏,示例如下:
@Component
struct page {
build() {
NavDestination() {
// ...
}
// 当NavDestination即将构建子组件之前会触发此回调。
.onShown(() => {
// ...
})
// 当该NavDestination页面隐藏时触发此回调。
.onHidden(() => {
})
// 当与Navigation绑定的导航控制器中存在内容时,此回调生效。当点击返回键时,触发该回调。
.onBackPressed(() => {
return true
})
}
}
如果想监听首页Navigation页面切换,可以使用uiObserver.on(‘navDestinationSwitch’)方法监听Navigation的页面切换事件,可在入参配置页面切换的回调函数。示例如下:
import { uiObserver } from '@kit.ArkUI';
function callBackFunc(info: uiObserver.NavDestinationSwitchInfo) {
let from = JSON.stringify(info.from)
let to = JSON.stringify(info.to)
console.info(`from:${from} -------- to: ${to}`);
}
@Entry
@Component
struct NavObserverDemo {
private stack: NavPathStack = new NavPathStack();
@Builder
Page(name: string) {
PageOne()
}
aboutToAppear() {
uiObserver.on('navDestinationSwitch', this.getUIContext(), callBackFunc); // 注册页面切换的监听
}
aboutToDisappear() {
uiObserver.off('navDestinationSwitch', this.getUIContext(), callBackFunc);
}
build() {
Navigation(this.stack) {
Button('跳转').onClick(() => {
this.stack.pushPath({ name: 'pageOne' });
})
}
.title('Navigation')
.navDestination(this.Page)
}
}
@Component
export struct PageOne {
build() {
NavDestination() {
Text('pageOne')
}.title('pageOne')
}
}
更多关于HarmonyOS 鸿蒙Next中两个页面路由跳转问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,本地测试未能复现您的问题,为了更快解决您的问题,尽量补全以下信息:
-
路由跳转使用的是router还是navigation,pageB页面的onpageshow和onpagehide是否正常触发?
-
复现代码(如最小复现demo);
-
版本信息(如:开发工具、手机系统版本信息);
您好,demo已经放在附件了,把txt后缀名删了再解压就可以了,辛苦帮忙看一下,
麻烦看下楼上回复是否能解决问题,
好呢,麻烦了~
在HarmonyOS Next中,页面路由跳转主要通过router
模块实现。使用router.pushUrl()
方法从当前页面跳转到目标页面,目标页面需在main_pages.json
中配置路由路径。示例代码:
import router from '@ohos.router';
router.pushUrl({ url: 'pages/SecondPage' });
返回上一页使用router.back()
。若需传递参数,可在pushUrl
的params
字段设置,目标页面通过router.getParams()
获取。确保页面路径正确注册,避免跳转失败。
在HarmonyOS Next中,页面路由跳转时生命周期回调未按预期执行,通常与页面栈管理或路由配置有关。以下是可能原因及解决方案:
-
页面栈未正确触发生命周期
- 若使用
router.pushUrl()
跳转时未设置mode: RouterMode.Standard
,可能导致页面未完全隐藏。建议显式指定路由模式:router.pushUrl({ url: 'pages/PageB', mode: RouterMode.Standard // 确保新页面入栈,触发原页面onPageHide })
- 若使用
-
单实例模式影响
- 若页面配置为单实例(
singleton: true
),重复跳转时不会触发完整的生命周期。检查module.json5
中页面配置:"page": { "name": "PageA", "singleton": false // 确保非单实例模式 }
- 若页面配置为单实例(
-
异步跳转延迟
- 若跳转前有未完成的异步操作(如网络请求),可能阻塞生命周期回调。确保跳转动作在同步流程中执行。
-
自定义组件生命周期覆盖
- 若在
@Entry
组件中重写了onPageShow
/onPageHide
但未调用父类方法,需补充super.onPageShow()
。
- 若在
验证步骤:
- 使用标准路由模式跳转,观察控制台日志。
- 检查页面栈状态:
router.getState()
确认页面是否正确入栈/出栈。 - 在
onPageHide
中添加日志,确认是否因页面未销毁而未触发。
若问题仍存在,建议提供路由跳转代码片段及页面配置,以便进一步分析。