前景:
这个项目是需要使用Navigation,但是官网的自定义路由表过于复杂,所以选择使用系统路由表,但是在使用过程中发现在feature层跨包使用的时候会报空指针错误
解决方案
1.将NavPathStack抽到公共层,封装成一个类
2.在页面的aboutToAppear中调用封装
实现步骤:
* 1.将主模块的NavPathStack传入createRouter接口,注册路由 * 2.通过registerBuilder接口,将需要动态加载的模块注册到路由中 (动态路由内容) * 3.通过push接口,跳转到指定的模块页面
封装代码
/**
*
* 实现步骤:
* 1.将主模块的NavPathStack传入createRouter接口,注册路由
* 2.通过registerBuilder接口,将需要动态加载的模块注册到路由中 (动态路由内容)
* 3.通过push接口,跳转到指定的模块页面
*/
export class DynamicsRouter {
static navPathStack: NavPathStack = new NavPathStack();
// 注册router
public static createRouter(router: NavPathStack): void {
DynamicsRouter.navPathStack = router;
}
// 通过名称获取router
public static getRouter(): NavPathStack | undefined {
let router = DynamicsRouter.navPathStack;
return router as NavPathStack;
}
/**
* 通过获取页面栈跳转到指定页面
*/
public static async push(name: string, param: string, animated: boolean = false): Promise<void> {
DynamicsRouter.getRouter()?.pushPath({ name: name, param: param }, animated);
}
public static async replace(name: string, param: string, animated: boolean = false): Promise<void> {
// 查找到对应的路由栈进行跳转
DynamicsRouter.getRouter()?.replacePathByName(name, param, animated);
}
// 通过获取页面栈并pop
public static pop(): void {
// 查找到对应的路由栈进行pop
DynamicsRouter.getRouter()?.pop();
}
}