HarmonyOS鸿蒙Next路由通信
在当前鸿蒙中路由提供了三种方案:
1、router:router对象类似于vue或者react框架中提供的路由对象。在代码中调用它的api来实现路由跳转、返回、参数的传递。
2、Navigation:这种方案是目前官方推荐我们使用,但是这种方案涵盖的内容比较多。底部tabbar,顶部菜单,返回等。集合了页面中各种跳转、返回、菜单的功能。
3、HMRouter:底层是对Navigation进行封装,集成了Navigation,NavDestination,NavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且再跳转床惨、额外的生命周期、服务型路由方面对系统能力进行了扩展。
router路由跳转
1、pushUrl:代表跳转页面的时候,将老的地址和新的地址都加入到页面执行栈。可以实现跳转过后记录信息,可以放回到执行的页面。
2、replaceUrl:代表替换当前这个页面的地址。直接覆盖我们访问地址。无法记录历史,无法返回跳转之前
router的模式:
1、Standard:多实例模式,按pushUrl来跳转,每次跳转路径都会放在执行栈中,不会去管执行栈中是否存在同样的路径
2、sinle:单实例模式,按pushUrl来跳转,每次跳转的路ing都会放在执行栈,如果下次访问同一个路径,默认将执行栈中存在的路径放在栈顶。执行栈中同样的路径只会存在一次。
总结:
1、路由跳转过程中,可以只传递第一个参数。里面包含跳转地址和传递参数
2、路由调转过程中,第二个参数可以省略,也可以加上。不写默认就是Standard模式
3、参数三代表跳转及结果。err值决定了是否有错误。
获取传递参数:
获取参数类型为object,后续在使用过程中出现类型不明确,进行报错
Navigation在此就不讨论了,NavDestination模板代码多,系统路由表需要手写,自定义转场实现困难,拦截器需要配置在PathStack,组件感知生命周期不变。无需纠结直接使用HMRouter。
HMRouter介绍:
特性
- 基于注解声明路由信息
- 注解参数支持使用字符串常量定义
- 页面路径支持正则匹配
- 支持Har、Hsp、Hap
- 支持Navigation路由栈嵌套
- 支持服务型路由
- 跳转时支持URL参数自动解析
- 支持路由拦截器(包含全局拦截、单页面拦截、跳转时一次性拦截)
- 支持生命周期回调(包含全局生命周期、单页面生命周期、NavBar生命周期)
- 内置转场动画(普通页面、Dialog),可配置方向、透明度、缩放,支持交互式转场动画,同时支持配置某个页面的转场动画、跳转时的一次性动画
- 提供更多高阶转场动画,包括一镜到底等(需依赖@hadss/hmrouter-transitions)
- 支持配置自定义页面模版,可以更灵活的生成页面文件
- 支持Dialog、单例类型页面
- 支持混淆白名单自动配置
工程配置:https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README.md
使用编译插件
1、在UIAbility或者启动框架AppStartup中初始化路由框架
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
HMRouterMgr.init({
context: this.context
})
}
}
2、定义路由入口
2.1、HMRouter依赖系统Navigation能力,所以必须在页面中定义一个HMNavigation容器,并设置相关参数
路由跳转流程:
HMNavigation, 路由容器组件
参数 | 说明 |
---|---|
navigationId | 需要开发者指定,并确保全局唯一,否则运行时输出报错日志 |
homePageUrl | 需要与@HMRouter(pageUrl)中的pageUrl一致,表示HMNavigation默认加载的页面。 |
navigationOption | 指定该HMNavigation的全局参数选项NavigationOption,保留可扩展性。 |
HMNavigationOption
参数 | 说明 |
---|---|
modifier | Navigation动态属性设置 |
standardAnimator | 页面全局动画配置 |
dialogAnimator | 弹窗全局动画配置 |
title | 系统Title设置 |
menus | 系统Menu设置 |
toolbar | 系统Toolbar设置 |
systemBarStyle | 系统SystemBar设置 |
@Entry
@Component
export struct Index {
modifier: NavModifier = new MyNavModifier();
build() {
// @Entry中需要再套一层容器组件,Column或者Stack
Column(){
// 使用HMNavigation容器
HMNavigation({
navigationId: 'mainNavigation', homePageUrl: 'MainPage',
options: {
standardAnimator: HMDefaultGlobalAnimator.STANDARD_ANIMATOR,
dialogAnimator: HMDefaultGlobalAnimator.DIALOG_ANIMATOR,
modifier: this.modifier
}
})
}
.height('100%')
.width('100%')
}
}
class MyNavModifier extends AttributeUpdater<NavigationAttribute> {
initializeModifier(instance: NavigationAttribute): void {
instance.hideNavBar(true);
}
}
2.2 路由跳转、传参和页面返回回调
2.3 拦截器标签 @HMInterceptor
标记在实现了IHMInterceptor的对象上,声明此对象为一个拦截器
执行时机:
- 当发生push/replace路由时,pageUrl为空时,拦截器不会执行,需传入pageUrl路径;
- 当跳转pageUrl目标页面不存在时,执行全局以及发起页面拦截器,当拦截器未执行DO_REJECT时,然后执行路由的onLost回调
- 当跳转pageUrl目标页面存在时,执行全局,发起页面和目标页面的拦截器;
拦截器执行顺序:
- 按照优先级顺序执行,不区分自定义或者全局拦截器,优先级相同时先执行@HMRouter中定义的自定义拦截器
- 当优先级一致时,先执行srcPage>targetPage>global
示例:
[@HMInterceptor](/user/HMInterceptor)({ interceptorName: 'LoginInterceptor', global: true })
export class LoginInterceptor implements IHMInterceptor {
handle(info: HMInterceptorInfo): HMInterceptorAction {
if(logininfo!=null){
return HMInterceptorAction.DO_NEXT;
}else{
HMRouterMgr.push({pageUrl:'LoginPage',skipAllInterceptors:true})
return HMInterceptorAction.DO_REJECT
}
}
}
2.4 生命周期标签 @HMLifecycle
标记在实现了IHMLifecycle的对象上,声明此对象为一个自定义生命周期处理器
生命周期触发顺序:
按照优先级顺序触发,不区分自定义或者全局生命周期,优先级相同时先执行@HMRouter中定义的自定义生命周期
生命周期跳转流程:
示例:
const TAG='Lifecycle'
[@HMLifecycle](/user/HMLifecycle)({ lifecycleName: 'OneLifecycle' })
export class OneLifecycle implements IHMLifecycle {
private time: number = 0;
str:string='中国'
onPrepare(ctx:HMLifecycleContext):void{}
onAppear(ctx:HMLifecycleContext):void{}
onDisAppear(ctx:HMLifecycleContext):void{}
onShown(ctx:HMLifecycleContext):void{
this.time = new Date().getTime();
Logger.info(TAG,'OneLifecycle`,currTime ${this.time});
}
onHidden(ctx:HMLifecycleContext):void{
const duration = new Date().getTime() - this.time;
Logger.info(TAG,'OneLifecycle`,Page ${ctx.navContext?.pathInfo.name} stay ${duration});
}
onWillAppear(ctx:HMLifecycleContext):void{}
onWillDisappear(ctx:HMLifecycleContext):void{}
onWillShow(ctx:HMLifecycleContext):void{}
onWillHide(ctx:HMLifecycleContext):void{}
onReady(ctx:HMLifecycleContext):void{}
onBackPressed(ctx:HMLifecycleContext):boolean{
return true
}
}
更多关于HarmonyOS鸿蒙Next路由通信的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next路由通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,路由通信主要依赖于分布式数据管理和分布式任务调度框架。通过分布式数据管理,设备间可以共享数据,实现无缝通信。分布式任务调度则允许应用在不同设备间迁移任务,确保任务执行的连续性。开发者可以使用@ohos.distributedData
和@ohos.distributedTask
等API来实现跨设备的路由通信,确保数据同步和任务调度的效率与可靠性。