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装饰的组件。

7 回复

【问题现象】

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提供了onShownonHiddenonBackPressed等属性可以设置对应的回调函数,通过这些属性监听页面的显示隐藏,示例如下:

@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


开发者您好,本地测试未能复现您的问题,为了更快解决您的问题,尽量补全以下信息:

  1. 路由跳转使用的是router还是navigation,pageB页面的onpageshow和onpagehide是否正常触发?

  2. 复现代码(如最小复现demo);

  3. 版本信息(如:开发工具、手机系统版本信息);

您好,demo已经放在附件了,把txt后缀名删了再解压就可以了,辛苦帮忙看一下,

麻烦看下楼上回复是否能解决问题,

好呢,麻烦了~

在HarmonyOS Next中,页面路由跳转主要通过router模块实现。使用router.pushUrl()方法从当前页面跳转到目标页面,目标页面需在main_pages.json中配置路由路径。示例代码:

import router from '@ohos.router';
router.pushUrl({ url: 'pages/SecondPage' });

返回上一页使用router.back()。若需传递参数,可在pushUrlparams字段设置,目标页面通过router.getParams()获取。确保页面路径正确注册,避免跳转失败。

在HarmonyOS Next中,页面路由跳转时生命周期回调未按预期执行,通常与页面栈管理或路由配置有关。以下是可能原因及解决方案:

  1. 页面栈未正确触发生命周期

    • 若使用router.pushUrl()跳转时未设置mode: RouterMode.Standard,可能导致页面未完全隐藏。建议显式指定路由模式:
      router.pushUrl({
        url: 'pages/PageB',
        mode: RouterMode.Standard // 确保新页面入栈,触发原页面onPageHide
      })
      
  2. 单实例模式影响

    • 若页面配置为单实例(singleton: true),重复跳转时不会触发完整的生命周期。检查module.json5中页面配置:
      "page": {
        "name": "PageA",
        "singleton": false // 确保非单实例模式
      }
      
  3. 异步跳转延迟

    • 若跳转前有未完成的异步操作(如网络请求),可能阻塞生命周期回调。确保跳转动作在同步流程中执行。
  4. 自定义组件生命周期覆盖

    • 若在@Entry组件中重写了onPageShow/onPageHide但未调用父类方法,需补充super.onPageShow()

验证步骤:

  • 使用标准路由模式跳转,观察控制台日志。
  • 检查页面栈状态:router.getState()确认页面是否正确入栈/出栈。
  • onPageHide中添加日志,确认是否因页面未销毁而未触发。

若问题仍存在,建议提供路由跳转代码片段及页面配置,以便进一步分析。

回到顶部