HarmonyOS Navigation路由跳转的完整示例
HarmonyOS Navigation路由跳转的完整示例
项目概述
RouterNavigationDemo 是一个 HarmonyOS 应用示例项目,展示了如何在多模块架构中实现页面路由跳转。项目包含一个主模块(entry)和两个库模块(lib_harA 和 lib_hspA),演示了跨模块的页面导航功能。
项目结构
RouterNavigationDemo/
├── entry/ # 主模块
│ ├── src/main/
│ │ ├── ets/
│ │ │ ├── entryability/ # 应用入口能力
│ │ │ │ └── EntryAbility.ets
│ │ │ └── pages/ # 页面文件
│ │ │ ├── Index.ets # 首页
│ │ │ └── PageOne.ets # 页面一
│ │ └── resources/
│ │ └── base/profile/
│ │ ├── main_pages.json # 主页面配置
│ │ └── router_map.json # 路由映射配置
├── lib_harA/ # HAR 库模块
│ └── src/main/
│ ├── ets/pages/
│ │ └── HarAPageOne.ets # HAR 页面一
│ └── resources/base/profile/
│ └── router_map.json # HAR 路由映射
└── lib_hspA/ # HSP 共享模块└── src/main/├── ets/pages/│ └── HspAPageOne.ets # HSP 页面一└── resources/base/profile/├── main_pages.json # HSP 主页面配置└── router_map.json # HSP 路由映射
路由配置详解
1. 主模块 (entry) 配置
1.1 module.json5
{"module": {"name": "entry","type": "entry","mainElement": "EntryAbility","pages": "$profile:main_pages","routerMap": "$profile:router_map"}
}
1.2 main_pages.json
{"src": ["pages/Index"]
}
1.3 router_map.json
{"routerMap": [{"name": "EntryPageOne","pageSourceFile": "src/main/ets/pages/PageOne.ets","buildFunction": "PageOneBuilder","data": {"description": "this is PageOne"}}]
}
2. HAR 库模块 (lib_harA) 配置
2.1 module.json5
{"module": {"name": "lib_harA","type": "har","routerMap": "$profile:router_map"}
}
2.2 router_map.json
{"routerMap": [{"name": "HarAPageOne","pageSourceFile": "src/main/ets/pages/HarAPageOne.ets","buildFunction": "HarAPageOneBuilder","data": {"description": "this is HarAPageOne"}}]
}
3. HSP 共享模块 (lib_hspA) 配置
3.1 module.json5
{"module": {"name": "lib_hspA","type": "shared","pages": "$profile:main_pages","routerMap": "$profile:router_map"}
}
3.2 main_pages.json
{"src": ["pages/Index"]
}
3.3 router_map.json
{"routerMap": [{"name": "HspAPageOne","pageSourceFile": "src/main/ets/pages/HspAPageOne.ets","buildFunction": "HspAPageOneBuilder","data": {"description": "this is HspAPageOne"}}]
}
页面路由关系图
┌─────────────────┐│ Index ││ (首页) │└─────────┬───────┘│┌─────────┴───────┐│ │┌───────────┴──────┐ ┌───────┴──────────┐ ┌───────────┴──────┐│ EntryPageOne │ │ HarAPageOne │ │ HspAPageOne ││ (主模块页面) │ │ (HAR库页面) │ │ (HSP共享页面) │└─────────┬────────┘ └────────┬─────────┘ └─────────┬────────┘│ │ │└────────────────────┼──────────────────────┘│┌─────────────────┴─────────────────┐│ 返回首页 ││ (pathStack.clear()) │└───────────────────────────────────┘
路由跳转实现
1. 首页 (Index.ets)
首页包含三个按钮,分别跳转到不同的页面:
// 跳转到主模块页面
Button($r('app.string.entry_pageOne')).onClick(() => {this.pathStack.pushPathByName('EntryPageOne', '从首页到EntryPageOne');})// 跳转到HAR库页面
Button($r('app.string.harA_pageOne')).onClick(() => {this.pathStack.pushPathByName('HarAPageOne', '从首页到HarAPageOne');})// 跳转到HSP共享页面
Button($r('app.string.hspA_pageOne')).onClick(() => {this.pathStack.pushPathByName('HspAPageOne', '从首页到HspAPageOne');})
2. 主模块页面 (PageOne.ets)
// 返回首页
Button('toEntryIndex').onClick(() => {this.pathStack.clear();})// 跳转到HAR库页面
Button('to_HarA_PageOne').onClick(() => {this.pathStack.pushPathByName('HarAPageOne', '从EntryPageOne到HarAPageOne');})// 跳转到HSP共享页面
Button('to_HspA_PageOne').onClick(() => {this.pathStack.pushPathByName('HspAPageOne', '从EntryPageOne到HspAPageOne');})
3. HAR库页面 (HarAPageOne.ets)
// 返回首页
Button('toEntryIndex').onClick(() => {this.pathStack.clear();})// 跳转到主模块页面
Button('to_Entry_PageOne').onClick(() => {this.pathStack.pushPathByName('EntryPageOne', '从HarAPageOne到EntryPageOne');})// 跳转到HSP共享页面
Button('to_HspA_PageOne').onClick(() => {this.pathStack.pushPathByName('HspAPageOne', '从HarAPageOne到HspAPageOne');})
4. HSP共享页面 (HspAPageOne.ets)
// 返回首页
Button('toEntryIndex').onClick(() => {this.pathStack.clear();})// 跳转到主模块页面
Button('to_Entry_PageOne').onClick(() => {this.pathStack.pushPathByName('EntryPageOne', '从HspAPageOne到EntryPageOne');})// 跳转到HAR库页面
Button('to_HarA_PageOne').onClick(() => {this.pathStack.pushPathByName('HspAPageOne', '从HspAPageOne到HarAPageOne');})
关键API说明
1. NavPathStack
NavPathStack
是 HarmonyOS 提供的导航路径栈,用于管理页面导航状态:
pushPathByName(name: string, param?: Object)
: 通过页面名称推入新页面clear()
: 清空导航栈,返回首页
2. NavDestination
每个页面都包装在 NavDestination
组件中,提供导航上下文:
NavDestination().onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack;this.paramStr = context.pathInfo.param as string;})
3. Navigation
首页使用 Navigation
组件作为导航容器:
Navigation(this.pathStack) {// 页面内容
}
路由跳转流程
- 应用启动:
EntryAbility
加载首页Index
- 页面跳转: 用户点击按钮,调用
pathStack.pushPathByName()
跳转 - 参数传递: 跳转时可以传递参数,在目标页面的
onReady
回调中接收 - 返回首页: 调用
pathStack.clear()
清空导航栈,返回首页
注意事项
- 模块依赖: 确保在
oh-package.json5
中正确配置模块依赖关系 - 路由名称: 路由名称必须与
router_map.json
中的name
字段一致 - 页面构建函数: 每个页面都需要提供对应的构建函数(如
PageOneBuilder
) - 导航栈管理: 合理使用
clear()
方法,避免导航栈过深
总结
RouterNavigationDemo 项目展示了 HarmonyOS 中多模块页面路由跳转的完整实现方案,通过 NavPathStack
和 router_map.json
配置,实现了跨模块的页面导航功能。这种架构设计使得应用具有良好的模块化特性,便于维护和扩展。