当前位置: 首页 > news >正文

HarmonyOS鸿蒙开发实战(5.0)自定义路由栈管理

鸿蒙HarmonyOS NEXT开发实战往期文章必看(持续更新......)

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

HarmonyOS NEXT应用开发案例实践总结合集

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

非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!


介绍

本案例将介绍如何使用路由跳转返回时获取到来源页的模块名以及路径名,在实际场景中同一页面通常会根据不同来源页展示不同的UI。

使用说明

无特殊使用说明,其他使用说明参考动态路由的相关说明

实现思路

路由来源页的实现

  1. 新增来源页字段
export class DynamicsRouter {...// 通过数组实现自定义栈的管理static routerStack: Array<RouterModel> = new Array();static referrer: string[] = [];...
}
  1. 注册路由
public static createRouter(router: NavPathStack): void {DynamicsRouter.navPathStack = router;// 初始化时来源页为未定义let homeRouterModule = new RouterModel();homeRouterModule.routerName = RouterInfo.HOME_PAGE[0];homeRouterModule.path = RouterInfo.HOME_PAGE[1];DynamicsRouter.routerStack.push(homeRouterModule)logger.info(`DynamicsRouter create routerStack Home is: ${homeRouterModule.routerName} + ${homeRouterModule.path}`);
}
  1. 获取路由来源页面栈
public static getRouterReferrer(): string[] {return DynamicsRouter.referrer;
}
  1. 通过页面栈跳转到指定页面
public static async push(router: RouterModel): Promise<void> {const path: string = router.path;const routerName: string = router.routerName;let param: string = router.param;console.info('push', path, routerName);// TODO:知识点:通过动态import的方式引入模块,在需要进入页面时才加载模块,可以减少主页面的初始化时间及占用的内存await import(routerName).then((ns: ESObject) => {console.info('harInit');ns.harInit(path) },(ret: ESObject) => {console.info('import reason', ret);});// push前记录当前页面的名字DynamicsRouter.getRouter().pushPath({ name: routerName, param: param });// 自定义栈也加入指定页面DynamicsRouter.routerStack.push(router);let referrerModel: RouterModel = DynamicsRouter.routerStack[DynamicsRouter.routerStack.length - 2];DynamicsRouter.referrer[0] = referrerModel.routerName;DynamicsRouter.referrer[1] = referrerModel.path;logger.info(`From DynamicsRouter.routerStack push preview module name is + ${DynamicsRouter.referrer[0]}, path is ${DynamicsRouter.referrer[1]}`);
}
  1. 通过页面栈返回上一页
// 通过获取页面栈并pop
public static pop(): void {// pop前记录的来源页为当前栈顶let referrerModel: RouterModel = DynamicsRouter.routerStack[DynamicsRouter.routerStack.length - 1];DynamicsRouter.referrer[0] = referrerModel.routerName;DynamicsRouter.referrer[1] = referrerModel.path;logger.info(`From DynamicsRouter.routerStack pop preview module name is + ${DynamicsRouter.referrer[0]}, path is ${DynamicsRouter.referrer[1]}`);if (DynamicsRouter.routerStack.length > 1) {DynamicsRouter.routerStack.pop();} else {logger.info("DynamicsRouter.routerStack is only Home.");}// 查找到对应的路由栈进行popDynamicsRouter.getRouter().pop();
}

路由来源页的使用

  1. 在任意模块中使用DynamicsRouter.createRouter()创建路由,在路由创建时会将主页HomePage推入自定义路由栈,并给代表来源页的referrer 字段赋值。

  2. 获取路由来源页面栈,执行DynamicsRouter.getRouterStack()获得自定义路由栈,该方法和Navigation的路由栈原理一致,会在push和pop页面跳转 之前记录来源页并赋值给referrer。

高性能知识点

不涉及

工程结构&模块类型

routermodule                                  // har类型
|---constants
|   |---RouterConstants.ets                     // 常量类,用于配置动态路由跳转页面的名称和模块路径
|---model
|   |---RouterModel.ets                         // 路由信息类,用于存储路由的相关信息
|---router
|   |---DynamicsRouter.ets                      // 动态路由实现类 + 来源页面

模块依赖

不涉及

参考资料

不涉及

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为体系杂乱无章,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线、视频、文档用来跟着学习是非常有必要的。

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

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

这份鸿蒙(HarmonyOS NEXT)包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。


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

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

路线图适合人群:

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

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

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)全球开发者的开源社区,开源代码

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)全球开发者的开源社区,开源代码

                   

鸿蒙APP开发必备

​​

总结

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

相关文章:

  • c# 将调试信息到VS输出窗口
  • Thingsboard规则链:fetch device credentials节点详解
  • 【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现
  • 第一章 初识Docker
  • QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!
  • 408算法题leetcode--第15天
  • 着色器ShaderMask
  • Python 课程18-SQLAlchemy
  • C++ bitset(位图)的模拟实现
  • RabbitMQ 快速入门
  • 从静态多态、动态多态到虚函数表、虚函数指针
  • 基于JAVA+SpringBoot+Vue的疫苗发布和接种预约系统
  • 认知世界的经济学读书笔记
  • slam典型应用手搓
  • 暴雨讲堂:算力高速互联催化超节点开启AI新篇章
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android Volley源码解析
  • Apache Pulsar 2.1 重磅发布
  • Bytom交易说明(账户管理模式)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Logstash 参考指南(目录)
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React的组件模式
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue组件定义
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 如何使用 JavaScript 解析 URL
  • 算法系列——算法入门之递归分而治之思想的实现
  • 算法之不定期更新(一)(2018-04-12)
  • 我感觉这是史上最牛的防sql注入方法类
  • 我这样减少了26.5M Java内存!
  • 用Canvas画一棵二叉树
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​浅谈 Linux 中的 core dump 分析方法
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define、const、typedef的差别
  • $.proxy和$.extend
  • $refs 、$nextTic、动态组件、name的使用
  • (9)目标检测_SSD的原理
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (SpringBoot)第二章:Spring创建和使用
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六)DockerCompose安装与配置
  • (论文阅读40-45)图像描述1
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模