鸿蒙(HarmonyOS)开发中,使用 Navigation组件进行页面跳转时,参数传递是实现页面间数据交互的核心环节。下面将从前置条件、传递参数、接收参数、返回参数以及注意事项等方面,梳理整个过程。

1. 前置条件与基本配置

在使用 Navigation 进行跳转前,必须完成以下基础配置:

  • 创建并绑定导航栈:需要实例化一个 NavPathStack对象,并将其绑定到 Navigation组件。
  • 配置路由映射表:在项目的 resources/base/profile/目录下创建 router_map.json文件,注册所有目标页面(包括页面名称、文件路径和构建函数名)。
  • 在 module.json5 中声明:在 module.json5文件的 "routerMap": "$profile:router_map"字段中关联路由表。
  • 规范目标页面结构:目标页面的根组件必须是 NavDestination,并且需要使用 @Builder装饰器导出一个构建函数,其名称必须与路由表中配置的 buildFunction完全一致。

2. 跳转时传递参数

在跳转时,可以通过 pushPathpushPathByName等方法传递参数。参数通过 param属性传递,其值可以是任意对象(但需注意序列化限制)。

以下示例使用 pushPathByName传递参数对象:

interface paramType {
  param: string
}
let paramA: paramType = {
  param: 'test1'
}
// 在跳转事件中传递参数
this.pathInfos.pushPathByName('MyFirstNavDestination', paramA);

3. 在目标页面接收参数

在目标页面中,可以通过 NavPathStack的 getParamByName方法获取传递过来的参数。为了确保参数已准备就绪,推荐在 NavDestination的 onReady生命周期回调中处理参数。对于 API version 9 及以上版本,如果同时实现了 onReady和 onNewParam,系统会优先触发 onNewParam回调。

获取参数的示例代码:

@Component
export struct MyFirstNavDestination {
  @Consume('pathInfos') pathInfos: NavPathStack;
  
  getParamsPrint() {
    // 通过页面名称获取参数
    console.info('param is ' + JSON.stringify(this.pathInfos.getParamByName('MyFirstNavDestination')));
  }

  build() {
    NavDestination() {
      // 页面内容
    }
    .onShown(() => {
      this.getParamsPrint(); // 在页面显示时打印参数
    })
  }
}

说明:

  onReady()更早触发:在 NavDestination中,onReady()在页面首次构建完成、即将首次显示前调用,此时页面可能还未对用户可见。在组件生命周期中通常只触发一次(除非组件被销毁后重新创建)。

  onShown()稍晚触发:在页面真正对用户可见之后。每次页面从隐藏变为可见时都会触发。

4. 返回时传递参数

当从当前页面返回上一个页面时,可以通过 pop()方法携带参数返回。上一个页面需要在跳转时(例如调用 pushPath)预先设置 onPop回调函数来接收返回的结果。

返回参数的页面(例如第二个页面):

@Component
export struct MySecondNavDestination {
  @Consume('pathInfos') pathInfos: NavPathStack;
  private routerParams: paramType = { param: 'test 2' };

  build() {
    NavDestination() {
      // 页面内容
    }
    .onBackPressed(() => {
      this.pathInfos.pop(this.routerParams); // 返回时携带参数
      return true;
    })
  }
}

接收返回参数的页面(例如第一个页面)在跳转时设置 onPop回调:

this.pathInfos.pushPath({
  name: 'MySecondNavDestination',
  param: null,
  onPop: (popInfo: PopInfo) => {
    // 接收从 MySecondNavDestination 返回的参数
    console.info(`last page is: ${popInfo.info.name}, result: ${JSON.stringify(popInfo.result)}`);
  }
});

备注:自API15起,推荐使用onResult处理返回场景的路由参数。

5. 注意事项

  • 参数类型限制Navigation的 param参数在传递过程中会经过序列化,因此不支持传递函数、方法、系统返回的对象(如 HashMapList。如果需要传递复杂对象或实现回调,建议使用 EventHub等事件通信机制。
  • 单实例页面参数管理:对于单实例跳转场景(即同一个页面实例被多次复用),在 API 18 及以下版本需要自行管理参数,确保每次显示时能获取到正确的数据。
  • 跳转拦截与中间页面回调:使用 popToName直接跳转到栈中某个页面时,中间被跳过的页面(例如从 D 直接返回到 A)不会触发其 onPop回调,设计时需注意数据清理或保存逻辑。
  • 路由表与预览器:使用系统路由表(router_map.json)时,在 DevEco Studio 的预览器上可能无法正常跳转(出现白屏),建议在真机或模拟器上进行调试。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐