HarmonyOS Navigation组件下多har/hsp间路由跳转依赖耦合问题?

按照

https://developer.huawei.com/consumer/cn/doc/harmonyos-samples/samples-0000001162414961

中 “应用导航设计”的demo示例,我在项目新进了一个hsp包hspD,并参考C1新建了D1页面,Index也按照harC里面编写,在RouterModule新建了个一个routerpath,测试运行页面跳转D1时,报错

TypeError: Cannot read property builder of undefined, 

通过打印,发现import了hspD项目的Index,是在加载D1页面的@Builder方法时报错问下,hsp该如何调整跳转成功,有无详细的demo

阅读 596
1 个回答

请参考:

在本地试了下是可以跳转HSP包的页面的,我的代码如下

1、hspd/index.ets:

import { BuilderNameConstants } from '@ohos/routermodule';

export function harInit(builderName: string): void {
switch (builderName) {
case BuilderNameConstants.HSPD_D1:
import("./src/main/ets/pages/D1");
break;
default:
break;
}
}

2、hspd/src/main/ets/pages/D1.ets:

import { BuilderNameConstants, buildRouterModel, RouterModule, RouterNameConstants, } from '@ohos/routermodule';

@Builder
export function harBuilder(value: object) {
NavDestination() {
Column() {
Text("D1")
}
.width('100%')
.height('100%')
}
.title('D1Page')
.onBackPressed(() => {
RouterModule.pop(RouterNameConstants.ENTRY_HAP);
return true;
})
}

const builderName = BuilderNameConstants.HSPD_D1;
if (!RouterModule.getBuilder(builderName)) {
let builder: WrappedBuilder<[object]> = wrapBuilder(harBuilder);
RouterModule.registerBuilder(builderName, builder);
}

3、需要修改下RouterModule模块utils.RouterModule.ets里面的代码,使用AppStorage去缓存路由相关数据,hsp中访问har包中的静态变量两次读出来的值不一样,正在定位,您可以通过APPStorage去规避这个问题。

export class RouterModule {
static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>();
static routerMap: Map<string, NavPathStack> = new Map<string, NavPathStack>();

// Registering a builder by name.
public static registerBuilder(builderName: string, builder: WrappedBuilder<[object]>): void {
let cacheBuilderMap: Map<string, WrappedBuilder<[object]>> | undefined = AppStorage.get('RouterBuildMap');
if (!cacheBuilderMap) {
cacheBuilderMap = new Map<string, WrappedBuilder<[object]>>();
}
cacheBuilderMap.set(builderName, builder);
AppStorage.setOrCreate('RouterBuildMap', cacheBuilderMap);
}

// Get builder by name.
public static getBuilder(builderName: string): WrappedBuilder<[object]> {
let cacheBuilderMap: Map<string, WrappedBuilder<[object]>> | undefined = AppStorage.get('RouterBuildMap');
if (!cacheBuilderMap) {
cacheBuilderMap = new Map<string, WrappedBuilder<[object]>>();
}
const builder = cacheBuilderMap.get(builderName);
if (!builder) {
Logger.info('not found builder ' + builderName);
}
return builder as WrappedBuilder<[object]>;
}

// Registering a router by name.
public static createRouter(routerName: string, router: NavPathStack): void {
let cacheRouterMap: Map<string, NavPathStack> | undefined = AppStorage.get('RouterMap');
if (!cacheRouterMap) {
cacheRouterMap = new Map<string, NavPathStack>();
}
cacheRouterMap.set(routerName, router);
AppStorage.setOrCreate('RouterMap', cacheRouterMap);
}

// Get router by name.
public static getRouter(routerName: string): NavPathStack {
let cacheRouterMap: Map<string, NavPathStack> | undefined = AppStorage.get('RouterMap');
if (!cacheRouterMap) {
cacheRouterMap = new Map<string

// Get router by name.
public static getRouter(routerName: string): NavPathStack {
let cacheRouterMap: Map<string, NavPathStack> | undefined = AppStorage.get('RouterMap');
if (!cacheRouterMap) {
cacheRouterMap = new Map<string, NavPathStack>();
}

return cacheRouterMap.get(routerName) as NavPathStack;
}