HarmonyOS开发实战( Beta5.0)自动生成动态路由实践

鸿蒙HarmonyOS开发往期必看:

HarmonyOS NEXT应用开发性能实践总结

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

本示例将介绍如何使用装饰器和插件,自动生成动态路由表,并通过动态路由跳转到模块中的页面,以及如何使用动态import的方式加载模块。

目前,已有三方库HMRouter封装了完整的动态路由功能,添加了生命周期回调、内置转场动画等功能,如有需要,可直接使用。

使用说明

  1. 自定义装饰器
  2. 添加装饰器和插件配置文件,编译时自动生成动态路由表
  3. 配置动态路由,通过WrapBuilder接口,动态创建页面并跳转。
  4. 动态import变量表达式,需要DevEco Studio NEXT Developer Preview1 (4.1.3.500)版本IDE,配合hvigor 4.0.2版本使用。
  5. 支持自定义路由栈管理

实现思路

动态路由的实现
  1. 初始化动态路由

     public static routerInit(config: RouterConfig, context: Context) {
       DynamicsRouter.config = config;
       DynamicsRouter.appRouterStack.push(HOME_PAGE);
       RouterLoader.load(config.mapPath, DynamicsRouter.routerMap, context);
     }
    
  2. 获取路由

    private static getNavPathStack(): NavPathStack {
      return DynamicsRouter.navPathStack;
    }
    
  3. 通过builderName,注册WrappedBuilder对象,用于动态创建页面

    private static registerBuilder(builderName: string, builder: WrappedBuilder<[object]>): void {
      DynamicsRouter.builderMap.set(builderName, builder);
    }
    
  4. 通过builderName,获取注册的WrappedBuilder对象

    public static getBuilder(builderName: string): WrappedBuilder<[object]> {
      let builder = DynamicsRouter.builderMap.get(builderName);
      if (!builder) {
        let msg = "not found builder";
        console.info(msg + builderName);
      }
      return builder as WrappedBuilder<[object]>;
    }
    
  5. 通过页面栈跳转到指定页面

    public static pushUri(name: string, param?: Object) {
      if (!DynamicsRouter.routerMap.has(name)) {
        return;
      }
      let routerInfo: AppRouterInfo = DynamicsRouter.routerMap.get(name)!;
      if (!DynamicsRouter.builderMap.has(name)) {
        import(`${DynamicsRouter.config.libPrefix}/${routerInfo.pageModule}`)
          .then((module: ESObject) => {
            module[routerInfo.registerFunction!](routerInfo);
            DynamicsRouter.navPathStack.pushPath({ name: name, param: param });
        })
          .catch((error: BusinessError) => {
            logger.error(`promise import module failed, error code:${error.code}, message:${error.message}`);
        });
      } else {
        DynamicsRouter.navPathStack.pushPath({ name: name, param: param });
        DynamicsRouter.pushRouterStack(routerInfo);
      }
    }
    
  6. 注册动态路由跳转的页面信息

    public static registerAppRouterPage(routerInfo: AppRouterInfo, wrapBuilder: WrappedBuilder<[object]>): void {
      const builderName: string = routerInfo.name;
      if (!DynamicsRouter.builderMap.has(builderName)) {
        DynamicsRouter.registerBuilder(builderName, wrapBuilder);
      }
    }
    
动态路由的使用
  1. 在工程的hvigor/hvigor-config.json5中配置插件

    {
        ...
        "dependencies": {
            ...
            "@app/ets-generator": "file:../plugin/AutoBuildRouter"
        }
    }
    
  2. 在工程的根目录的build-profile.json5中添加动态路由模块和需要加载的子模块的依赖,详细代码参考build-profile.json5。

    {
      "app":{
        ...
      }
      "modules":{
        ...
        {
          "name": "eventpropagation",
          "srcPath": "./feature/eventpropagation"
        },
        {
          "name": "routermodule",
          "srcPath": "./common/routermodule"
        }
        ...
      }
    }
    
  3. 在主模块中添加动态路由和需要加载的子模块的依赖,详细代码请参考oh-package.json。

    "dependencies": {
      "@ohos/dynamicsrouter": "file:../../common/routermodule",    
      "@ohos/event-propagation": "file:../../feature/eventpropagation",
      ...
    }
    
  4. 在主模块中添加动态import变量表达式需要的参数,此处在packages中配置的模块名必须和oh-package.json中配置的名称相同,详细代码请参考build-profile.json5。

    ...
    "buildOption": {
      "arkOptions": {
        "runtimeOnly": {
          "packages": [
            "@ohos/event-propagation",
            ...
          ]
        }
      }
    }
    
  5. 在主模块EntryAbility的onCreate接口初始化动态路由,详细代码请参考EntryAbility.ets。

    ...
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
      DynamicsRouter.routerInit({
        libPrefix: "@ohos", mapPath: "routerMap"
      }, this.context);
      ...
    }
    ...
    
  6. 在主模块的WaterFlowData.ets中,将子模块要加载的页面,添加到列表中,详细代码请参考WaterFlowData.ets和SceneModuleInfo。

    export const waterFlowData: SceneModuleInfo[] = [
      ...
      new SceneModuleInfo($r('app.media.address_exchange'), '地址交换动画', new RouterInfo("", ""), '动效', 2, "addressexchange/AddressExchangeView"),
      ...
    }
    
  7. 在需要加载时将页面放入路由栈,详细代码请参考FunctionalScenes.ets。

    @Builder
    methodPoints(listData: ListData) {
      Column() {
      ...
        .onClick(() => {
          ...
          DynamicsRouter.pushUri(this.listData.appUri);
          ...
        })
    }
    
    
  8. 在子模块中添加动态路由的依赖,详细代码可参考oh-package.json。

    ...
    "dependencies": {
      ...
      "@ohos/dynamicsrouter": "file:../../common/routermodule"
    }
    

以上是需要在主模块中添加的配置,如果已经添加过相关代码,则可以直接略过,按照下面的步骤在子模块中添加相关即可自动生成动态路由相关文件。

  1. 在子模块的oh-package.json5中添加路由模块依赖,可参考oh-package.json5

    {
      ...
      "dependencies": {
        ...
        // 动态路由模块,用于配置动态路由
        "@ohos/dynamicsrouter": "file:../../common/routermodule"
      }
    }
    
  2. 在子模块的hvigorfile.ts文件中添加插件配置,可参考hvigorfile.ts

    ...
    import { PluginConfig, etsGeneratorPlugin } from '@app/ets-generator';
    // 配置路由信息
    const config: PluginConfig = {
      // 需要扫描的文件的路径,即配置自定义装饰AppRouter的文件路径
      scanFiles: ["src/main/ets/view/AddressExchangeView"]
    }
    
    export default {
      ...
      plugins: [etsGeneratorPlugin(config)]         /* Custom plugin to extend the functionality of Hvigor. */
    }
    
  3. 在需要跳转的页面的自定义组件上添加装饰器,可参考AddressExchangeView.ets,如果需要通过路由传递参数,则需要设置hasParam为true,可参考NavigationParameterTransferView.ets。

    // 自定义装饰器,用于自动生成动态路由代码及页面的跳转。命名规则:模块名/自定义组件名
    @AppRouter({ name: "addressexchange/AddressExchangeView" })
    @Component
    export struct AddressExchangeView {
      ...
    }
    

高性能知识点

本示例使用动态import的方式加载模块,只有需要进入页面时才加载对应的模块,减少主页面启动时间和初始化效率,减少内存的占用。

工程结构&模块类型

routermodule                                  // har类型
|---annotation
|---|---AppRouter.ets                         // 自定义装饰器
|---constants
|   |---RouterInfo.ets                        // 路由信息类,用于配置动态路由跳转页面的名称和模块名(后续会删除)
|---model
|   |---AppRouterInfo.ets                     // 路由信息类
|   |---RouterParam.ets                       // 路由参数
|---router
|   |---DynamicsRouter.ets                    // 动态路由实现类
|---util
|   |---RouterLoader.ets                      // 路由表加载类

模块依赖

不涉及

参考资料

动态路由Sample

FAQ

Q:动态路由用起来比较麻烦,为什么不直接使用系统提供的页面路由,而是要重写一套路由栈管理?

A:系统层面现在提供了两种方式进行页面跳转,分别是页面路由 (@ohos.router)和组件导航 (Navigation)。这两种方式用起来都比较简单,但是Router相较于Navigation缺少很多能力(具体可参考Router和Navigation能力对标),所以目前应用开发中推荐使用Navigation进行页面跳转。

而使用Navigation时存在一个问题,需要将跳转的子页面组件通过import的方式引入,即不论子页面是否被跳转,都会使子页面引用的部分组件被初始化。例如页面A使用Navigation跳转到页面B,页面B中有用到Web组件加载一个H5页面。那么当进入页面A时,就会初始化Web组件相关的so库。即使用户只是在页面A停留,并没有进入页面B,也会在进入页面A时多出一部分初始化so库的时间和内存。这是因为在页面A中会直接import页面B的自定义组件,导致so库提前初始化。这样就会导致主页面启动耗时延长,以及不必要的内存消耗。

由于动态路由使用了动态import实现,可以很好的避免这种情况的发生。只有在进入子页面时,才会去初始化子页面的相关组件,减少主页面的启动时间和内存占用,提升性能。而且由于使用了自定义路由栈,可以定制业务上的需求,更好的进行管理。

当主页面中需要跳转的子页面较少时,使用Navigation更加方便。反之,则更推荐使用动态路由进行跳转。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记  希望这一份鸿蒙学习文档能够给大家带来帮助~


鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)       

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/875815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Azure Devops Pipeline将Docker应用部署到你的Raspberry Pi上

文章目录 1. 添加树莓派到 Agent Pool1.1 添加pool1.2 添加agent 2. 将树莓派添加到 Deployment Pool2.1 添加pool2.2 添加target 3. 添加编译流水线3.1 添加编译命令3.2 配置触发器 4. 添加发布流水线4.1 添加命令行4.2 配置artifact和触发器 5. 完成 1. 添加树莓派到 Agent P…

三菱FX5U CPU 内置以太网功能

什么是内置以太网功能FX5CPU模块内置以太网通信端口&#xff0c;可以利用TCP/IPUDP/IP通信协议&#xff0c;经过以太网(100BASE-TX、10BASET)与计算机或其他以太网设备进行通信。 MELSOFT连接 与MELSOFT产品连接的功能&#xff0c;MELSOFT产品主要指三菱的软件及GOT。 SLMP通信…

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写&#xff0c;而这些读写操作均是操作在Topic上的&#xff0c;Topic的创建就尤为关键&#xff0c;其中涉及分区分配策略、状态流转等&#xff0c;而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …

【GBase 8c V5_3.0.0 分布式数据库常用维护命令】

一、查看数据库状态/检查&#xff08;gbase用户&#xff09; 1.gha_ctl monitor 使用gha_ctl monitor查看节点运行情况(跟dcs的地址和端口) gha_ctl monitor -c gbase -l http://172.20.10.8:2379 -Hall |coordinator | datanode | gtm | server|dcs:必选字段。指定查看哪类集…

Oracle EBS AP预付款行分配行剩余预付金额数据修复

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题情况 AP预付款已验证和自动审批但是未过账已经AP付款但是又撤消付款并且未过账问题症状 AP预付款暂挂: AP预付款行金额(等于发票金额)与分配行金额不相等: 取消AP预付款提示如下:

基于Python的B站热门视频可视化分析与挖掘系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着互联网视频平台的迅猛发展&#xff0c;如何从海量的数据中提炼出有价值的信息成为了内容创作者们关注的重点之一。B站&#xff08;哔哩哔哩&#xff09;作为国内领先的年轻人文化社区&#xf…

08 vue3之认识bem架构及less sass 和scoped

bem架构 他是一种css架构 oocss 实现的一种 &#xff08;面向对象css&#xff09; &#xff0c;BEM实际上是block、element、modifier的缩写&#xff0c;分别为块层、元素层、修饰符层&#xff0c;element UI 也使用的是这种架构 1. BEM架构 1. 介绍 1. BEM是Block Element M…

美联社发稿推广中必备的6个社交媒体平台

社交媒体是现代社会中不可或缺的一部分&#xff0c;它已经成为了信息传播、群体交流和网络推广的重要工具。对于彭博社这样的专业媒体来说&#xff0c;充分利用社交媒体平台可以更好地推广自己的新闻报道和文章。 在这篇文章中&#xff0c;我们将介绍彭博社发稿推广中必备的六…

SpringBoot实现房产销售系统全解析

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

2024/9/9 408“回头看”:b树

B树是什么&#xff1f;有什么作用&#xff1f;B树的插入和删除具体细节是什么&#xff1f;除了B树还有一个是B&#xff0b;树、还是B-树&#xff0c;他们有什么区别&#xff0c;又有什么相同点&#xff1f; b树在王道考研查找这一章&#xff0c;所以他的主要作用就是查找。 在…

spring常用注解(10)@Order

一、 1、作用 加Order()注解&#xff0c;在注解中加入数字&#xff0c;数字越小&#xff0c;优先级越高&#xff0c;最先执行。 2、使用方法 &#xff08;1&#xff09;自定义顺序 Component Order(1) public class XxxFilter extends OncePerRequestFilter{}Component Or…

Python编码系列—Python工厂方法模式:构建灵活对象的秘诀

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

P3565 [POI2014] HOT-Hotels

~~~~~ P3565 [POI2014] HOT-Hotels ~~~~~ 总题单链接 ~~~~~ 2024.9.10&#xff1a;DP方程有问题&#xff0c;已修改&#xff0c;同时更新了长链剖分优化版本。 思路 ~~~~~ 设 g [ u ] [ i ] g[u][i] g[u][i] 表示在 u u u 的子树内&#xff0c;距离 u u u 为 i i i 的点的…

Android 手机自动化测试工具有哪几种?

一、Android手机自动化测试工具&#xff0c;常用的有这7中&#xff1a; 1、首推Appium&#xff1a; 推荐理由&#xff1a;功能非常强大的移动端自动化测试框架&#xff0c;还免费 下载链接&#xff1a;Appium: Mobile App Automation Made Awesome. Appium是一种被广泛使用的…

SAP自动化-AS02修改资产信息

Python源码 #-Begin-----------------------------------------------------------------#-Includes-------------------------------------------------------------- import sys, win32com.client import os#-Sub Main-----------------------------------------------------…

赵进喜:不透析、不用肾移植,“三维护肾”巧治尿毒症

潜心研究中医药治疗尿毒症等慢性肾脏重症40余年来&#xff0c;北京名老中医&#xff0c;慢性肾病国医大师吕仁和教授医术传承人&#xff0c;全国优秀基层名中医赵进喜总结出弥足珍贵的重症良方&#xff0c;临床应用无数次守护近10万肾病重症患者生命。让仅有22岁的慢性肾衰尿毒…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询&#xff0c;包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求&#xff0c;选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址&#xff1a;https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上&#xff0c;bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

测试2sigma离群点过滤

椭圆跑道形内部的离群点移除失败,影响拟合结果

『功能项目』战士的伤害型技能【45】

我们打开上一篇44战士职业平A怪物掉血的项目&#xff0c; 本章要做的事情是制作技能按钮&#xff0c;点鼠标点击时释放对范围内怪物的伤害技能 首先双击打开资源脚本下的Canvas预制体 制作技能栏 在资源商店中下载免费资源 - 技能图片 将技能图片拖拽至技能栏的Button按钮组件…