HarmonyOS鸿蒙Next中【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力
HarmonyOS鸿蒙Next中【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力 在大型软件工程中,代码和业务往往会划分为多个模块,分别由不同的开发人员进行开发。最终一个应用可能由Hap,Hsp,Har多种包组成,页面路由需要在不同的包中流转。
针对这种情况,Navigation路由框架也支持跨包跳转,如从Hap中的主页,跳转到Hsp/Har中的子页面,也可以从Hsp/Har中的子页面返回到Hap中的主页。
如下示例中,Hap包中有两个页面 HapPageA和HapPageB,Hsp包中有两个页面HspPageA和HspPageB,Har包中也有两个页面HarPageA,HarPageB,实现这六个页面之间的相互跳转。
1、模块配置
首先,跨包路由需要使用Navigation系统路由表,需要在hap,hsp,har包中分别配置对应的路由表。步骤如下:
Step 1
在每个模块的module.json5中增加"routerMap"字段,并且指定内容为"$profile:router_map";
Step 2
在每个模块的 "src/main/resources/base/profile/"目录(如果没有该目录的话,自己创建一个即可)下创建一个router_map.json文件
Steps3
在router_map.json文件中填写具体的路由表信息(下面仅以Hap模块中的配置为例),示例如下:
{
"routerMap": [
{
"name": "HapPageA",
"pageSourceFile": "src/main/ets/pages/HapPageA.ets",
"buildFunction": "HapPageABuilder",
"data": {
"description": "this is HapPageA"
}
},
{
"name": "HapPageB",
"pageSourceFile": "src/main/ets/pages/HapPageB.ets",
"buildFunction": "HapPageBBuilder",
"data": {
"description": "this is HapPageB"
}
}
]
}
路由表由一个名字为routerMap的数组组成,数组中的每一个item代表一个路由跳转目的地,需要由"name",“pageSourceFile”,"buildFunction"三个必选字段和一个"data"可选字段组成。
name代表Navigation路由跳转时pushPath指定的name,pageSourceFile代表对应的页面所在的文件路径,buildFunction代表文件中构建页面的@Builder函数,data则表示一个可选的参数,在目标NavDestination页面的onReady生命周期中可以通过传入的NavDestinationContext.getConfigInRouteMap()函数拿到该data数据。
2、代码编写
下面以Hap包中的HapPageA为例:
import { ControlPanel } from './Common';
@Component
export struct HapPageA {
build() {
NavDestination() {
Stack({alignContent: Alignment.Center}) {
ControlPanel()
}.width('100%').height('100%')
}.title('HapPageA')
.onReady((ctx: NavDestinationContext) => {
let config = ctx.getConfigInRouteMap();
console.log(`testTag HapPageA config.data: ${JSON.stringify(config?.data)}`)
})
}
}
// 页面的buildFunction,用于构造页面
@Builder
export function HapPageABuilder(): void {
HapPageA()
}
其中Common是为了方便演示页面间跳转抽出来的一个控制面板组件,示例如下:
@Component
export struct ControlPanel {
private stack: NavPathStack | undefined = undefined;
aboutToAppear(): void {
let info = this.queryNavigationInfo();
this.stack = info?.pathStack;
}
build() {
Column() {
Button('push HapPageA').onClick(() => {
this.stack?.pushPath({ name: 'HapPageA' })
})
Button('push HapPageB').onClick(() => {
this.stack?.pushPath({ name: 'HapPageB' })
})
Button('push HarPageA').onClick(() => {
this.stack?.pushPath({ name: 'HarPageA' })
})
Button('push HarPageB').onClick(() => {
this.stack?.pushPath({ name: 'HarPageB' })
})
Button('push HspPageA').onClick(() => {
this.stack?.pushPath({ name: 'HspPageA' })
})
Button('push HspPageB').onClick(() => {
this.stack?.pushPath({ name: 'HspPageB' })
})
}
}
}
3、编译构建
因为Har和Hsp是被Hap模块依赖的,所以需要先编译Har和Hsp,然后把他们的编译产物放到一个公共目录里面。
Step 1:编译Har
Step 2:编译Hsp
Step 3:配置依赖包
将Har和Hsp的编译产物放到一个公共路径中,这里为了演示方便,我们在工程根目录创建一个libs目录,把前面两个步骤的产物都复制到该目录:
Step 4:配置依赖关系
由于Hap依赖于前面的Hsp和Har,因此需要在Hap模块的oh-package.json5配置文件中增加依赖关系,示例如下:
{
"name": "entry",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"har_a": "file:../libs/HAR_A.har", // 因为演示中使用的是本地依赖包,所以通过file指示一个固定的文件。
"hsp_a": "file:../libs/HSP_A-default.tgz" // 因为演示中使用的是本地依赖包,所以通过file指示一个固定的文件。
}
}
配置好依赖关系后,需要指定 ohpm install 命令安装对应的包。
Step 5:编译运行
最后编译构建Hap包
需要注意的是由于Hap依赖于Hsp,所以安装到设备中时需要同时安装Hap和Hsp,应用才能正常运行。
如下为演示效果:
4、附件
上述案例完整示例代码如下: (代码待补充)
【系列其他文章】
- 【ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件
- 【ArkUI路由/导航系列】二:Navigation基础路由操作,让页面跳转起来
- 【ArkUI路由/导航系列】三:NavDestination标题栏和工具栏,丰富页面信息
- 【ArkUI路由/导航系列】四:Navigation页面信息查询
- 【ArkUI路由/导航系列】五:Navigation生命周期管理
- 【ArkUI路由/导航系列】六:Navigation组件的无感监听
- 【ArkUI路由/导航系列】七:Navigation自定义转场动画,让页面切换炫起来
- 【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力
- 【ArkUI路由/导航系列】九:Navigation分栏开发,开启多设备开发之旅
- 【ArkUI路由/导航系列】十:Navigation嵌套开发
- 【ArkUI路由/导航系列】十一:Navigation弹窗页面开发
- 【ArkUI路由/导航系列】十二:Navigation路由拦截
更多关于HarmonyOS鸿蒙Next中【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,ArkUI的Navigation跨包路由功能支持不同模块/包之间的页面跳转。需在目标模块的module.json5中声明路由入口,使用"uri"形式进行跨包导航。示例代码:
// 跳转至其他包的页面
router.pushUrl({
uri: 'bundle://com.example.otherbundle/entry/OtherPage'
})
目标页面需在对应模块的module.json5配置路由:
"abilities": [{
"name": "OtherPage",
"srcEntry": "./ets/otherpage/OtherPage.ets",
"uri": "entry/OtherPage"
}]
跨包路由需确保目标包已安装,且uri路径匹配配置。
更多关于HarmonyOS鸿蒙Next中【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个关于HarmonyOS Next中Navigation跨包路由的详细技术分享,我来总结几个关键点:
-
跨包路由配置的核心是在每个模块的module.json5中添加"routerMap"字段,并创建对应的router_map.json路由表文件。路由表需要包含name、pageSourceFile和buildFunction三个必填字段。
-
代码实现方面,每个页面需要提供对应的@Builder函数(如HapPageABuilder),这是跨包路由能够正确构建页面的关键。
-
编译构建时需要注意依赖顺序:
- 先编译Har和Hsp模块
- 将产物放到公共目录
- 在Hap的oh-package.json5中配置依赖关系
- 最后编译主Hap模块
-
运行时需要同时安装Hap和Hsp包,这点对于调试很重要。
-
通过NavPathStack的pushPath方法可以实现跨包页面跳转,参数中的name需要与路由表中配置的一致。
这个方案很好地解决了HarmonyOS多模块开发中的页面路由问题,特别是对于大型项目拆分为多个Hap/Hsp/Har包的情况。路由表的集中管理也使得跨包跳转更加规范。