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容器,并设置相关参数

路由跳转流程:

cke_157230.png

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的对象上,声明此对象为一个拦截器

执行时机:

  1. 当发生push/replace路由时,pageUrl为空时,拦截器不会执行,需传入pageUrl路径;
  2. 当跳转pageUrl目标页面不存在时,执行全局以及发起页面拦截器,当拦截器未执行DO_REJECT时,然后执行路由的onLost回调
  3. 当跳转pageUrl目标页面存在时,执行全局,发起页面和目标页面的拦截器;

拦截器执行顺序:

  1. 按照优先级顺序执行,不区分自定义或者全局拦截器,优先级相同时先执行@HMRouter中定义的自定义拦截器
  2. 当优先级一致时,先执行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中定义的自定义生命周期

生命周期跳转流程:

cke_321665.png

示例:

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

1 回复

更多关于HarmonyOS鸿蒙Next路由通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,路由通信主要依赖于分布式数据管理和分布式任务调度框架。通过分布式数据管理,设备间可以共享数据,实现无缝通信。分布式任务调度则允许应用在不同设备间迁移任务,确保任务执行的连续性。开发者可以使用@ohos.distributedData@ohos.distributedTask等API来实现跨设备的路由通信,确保数据同步和任务调度的效率与可靠性。

回到顶部