Navigation应用导航设计
将路由功能抽取成单独的模块并以har包形式存在,命名为RouterModule。RouterModule内部对路由进行管理,对外暴露RouterModule对象供其他模块使用。由于Entry.hap是应用必备的主入口,利用该特性考虑将主入口模块作为其他业务模块的依赖注册中心,在入口模块中使用Navigation组件并依赖其他业务模块。业务模块仅依赖RouterModule,业务模块中的路由统一委托到RouterModule中管理,实现业务模块间的解耦。
模块之间的依赖关系:
entry依赖:routerHar、hara、harb 也就是全部模块;
hara和harb分别依赖routerHar模块儿就行了
在自己模块的oh-package.json5加入依赖就可以了,entry为例:
entry的oh-package.json5
{
"name": "entry",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"@ohos/routerhar": "file:../routerHar",
"@ohos/hara": "file:../hara",
"@ohos/harb": "file:../harb"
}
}
routerHar模块
RouterModule模块
export class RouterModule {
// 1.定义路由表和路由栈
// WrappedBuilder支持@Builder描述的组件以参数的形式进行封装存储
static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>();
// 初始化路由栈,需要关联Navigation组件
// static navPathStack: NavPathStack = new NavPathStack();
// 建立NavPathStack的路由栈表,key是路由栈名,value是对应的路由栈对象
static routerMap: Map<string, NavPathStack> = new Map<string, NavPathStack>();
// 2.增加路由注册和路由获取的方法,业务模块的通过路由注册将需要路由的页面委托给RouterModule管理
// 注册页面组件到路由表,builderName是路由名字,builder参数是包裹了页面组件的WrappedBuilder对象
public static registerBuilder(builderName: string, builder: WrappedBuilder<[object]>): void {
console.log(`oneToMore registerBuilder name ${builderName},szie ${RouterModule.builderMap.size}`)
RouterModule.builderMap.set(builderName, builder);
console.log(`oneToMore registerBuilder name, ${builderName},size ${RouterModule.builderMap.size}`)
}
// 获取路由表中指定的页面组件 获取注册中的组件
public static getBuilder(builderName: string): WrappedBuilder<[object]> {
const builder = RouterModule.builderMap.get(builderName);
if (!builder) {
console.log(`oneToMore not found build ${builderName}`)
}
console.log(`oneToMore getBuilder.name ${JSON.stringify(builder?.builder.name)}`)