基于HMRouter的路由跳转方案
HMRouter简介
HMRouter作为HarmonyOS的页面跳转场景解决方案,聚焦解决应用内原生页面的跳转逻辑。
HMRouter底层对系统Navigation进行封装,集成了Navigation、NavDestination、NavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且在跳转传参、额外的生命周期、服务型路由方面对系统能力进行了扩展。
目的是让开发者在开发过程中无需关注Navigation、NavDestination容器组件的相关细节及模板代码,屏蔽跳转时的判断逻辑,降低拦截器、自定义转场动画实现复杂度,更好的进行模块间解耦。
特性
- 基于注解声明路由信息。
- 注解中页面路径支持使用字符串常量定义。
- 支持Har、Hsp、Hap。
- 支持Navigation路由栈嵌套。
- 支持服务型路由。
- 支持路由拦截器(包含全局拦截、单页面拦截、跳转时一次性拦截)。
- 支持生命周期回调(包含全局生命周期、单页面生命周期、跳转时一次性生命周期、NavBar生命周期)。
- 内置转场动画(页面、Dialog),可配置方向、透明度、缩放,支持交互式转场动画,同时支持配置某个页面的转场动画、跳转时的一次性动画。
- 支持Dialog类型页面、支持单例页面。
依赖版本
HarmonyOS NEXT Developer Beta5及以上。
手机版本:NEXT.0.0.60及以上。
下载安装
使用ohpm安装依赖。
或者按需在模块中配置运行时依赖,修改oh-package.json5。
使用配置
编译插件配置
1.修改项目的hvigor/hvigor-config.json文件,加入路由编译插件。
2.在模块中引入路由编译插件,修改hvigorfile.ts。
如果模块是Har则使用harPlugin(), 模块是Hsp则使用hspPlugin()。
3.在项目根目录创建路由编译插件配置文件hmrouter_config.json(可选)。
配置文件读取规则为 模块 > 工程 > 默认 优先使用本模块内的配置,如果没有配置,则找模块目录的上级目录(最多找三层目录,找到则停止),若找不到则使用默认配置。
工程配置
由于拦截器、生命周期和自定义转场动画会在运行时动态创建实例,因此需要进行如下配置,使得HMRouter路由框架可以动态导入项目中的模块。
1.在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true。
2.在oh-package.json5中配置对Har和Hsp的依赖,这里需要注意依赖的模块名称需要与模块的moduleName保持一致。
详见官网文档:动态import实现方案介绍 中的备注部分。
快速开始
在UIAbility或者启动框架AppStartup中初始化路由框架
使用启动框架请查看:如何在启动框架中初始化HMRouter。
定义路由入口:
定义拦截器
定义生命周期
自定义转场动画
路由跳转使用
定义页面PageB,绑定生命周期及自定义转场动画。
定义页面PageA,并执行路由跳转至PageB。
服务路由使用
当前不支持同时和其他注解混用,也不支持静态方法。
混淆配置说明
@hadss/hmrouter(1.0.0-rc.6)版本之后HMRouter支持混淆自动配置白名单。
开发者在build-profile.json5中配置混淆选项enable为true(开启混淆),如下所示,并且在当前模块hmrouter_config.json中配置autoObfuscation为true(默认为false)。HMRouter会自动生成HMRouter必须的白名单配置。将其保存在当前模块hmrouter_obfuscation_rules.txt文件中,并在编译阶段将该文件自动加入到混淆配置文件files列表中,实现混淆自动配置效果。
如果将autoObfuscation改为false,则只会生成混淆规则文件,但不会自动修改模块的混淆配置。 开发者需要自行将生成的混淆文件hmrouter_obfuscation_rules.txt文件加入到混淆配置文件files列表中。
HMRouter手动配置混淆请参考HMRouter混淆配置。
HMRouter标签的使用规则
路由标签@HMRouter
@HMRouter(pageUrl, dialog, singleton, interceptors, lifecycle, animator) 标签使用在自定义组件struct上,且该自定义组件需要添加export关键字。
- pageUrl: string, 用来表示NavDestination,必填。
支持使用本文件或者本模块定义的常量,或者Class中定义的静态变量。
- dialog: boolean, 是否是Dialog类型页面,非必填,默认为false。
- singleton: boolean, 是否是单例页面,单例页面即表示在一个HMNavigation容器中,只有一个此页面,非必填,默认为false。
- interceptors: string[], @HMInterceptor标记的拦截器名称列表,非必填。
- lifecycle: string, @HMLifecycle标记的生命周期处理实例,非必填。
- animator: string, @HMAnimator标记的自定义转场实例,非必填。
示例:
拦截器标签 @HMInterceptor
标记在实现了IHMInterceptor的对象上,声明此对象为一个拦截器。
- interceptorName: string, 拦截器名称,必填。
- priority: number, 拦截器优先级,数字越大优先级越高,非必填,默认为9。
- global: boolean, 是否为全局拦截器,当配置为true时,所有跳转均过此拦截器;默认为false,当为false时需要配置在@HMRouter的interceptors中才生效。
执行时机:
在路由栈发生变化前,转场动画发生前进行回调。
拦截器执行顺序:
- 按照优先级顺序执行,不区分自定义或者全局拦截器,优先级相同时先执行@HMRouter中定义的自定义拦截器。
- 当优先级一致时,先执行srcPage>targetPage>global。
srcPage表示跳转发起页面。
targetPage表示跳转结束时展示的页面。
示例:
生命周期标签 @HMLifecycle
标记在实现了IHMLifecycle的对象上,声明此对象为一个自定义生命周期处理器。
- lifecycleName: string, 自定义生命周期处理器名称,必填。
- priority: number, 生命周期优先级,数字越大优先级越高,非必填,默认为9。
- global: boolean, 是否为全局生命周期,当配置为true时,所有页面生命周期事件会转发到此对象;默认为false。
生命周期触发顺序:
按照优先级顺序触发,不区分自定义或者全局生命周期,优先级相同时先执行@HMRouter中定义的自定义生命周期。
示例:
转场动画标签 @HMAnimator
标记在实现了IHMAnimator的对象上,声明此对象为一个自定义转场动画对象。
- animatorName: string, 自定义动画名称,必填。
示例:
服务标签 @HMService
标记在类的方法上,声明此方法为一个服务。
- serviceName: string,服务名称,必填。
- singleton: boolean,是否是单例,非必填,默认为false。
示例:
HMRouter接口和属性列表
查看详情
FAQ
查看详情
原生到原生页面跳转场景解决方案
查看详情
原理介绍
查看详情
开源协议
本项目基于Apache License 2.0 ,请自由地享受和参与开源。
讲解的很棒
棒棒哒