鸿蒙Next-集成HmRouter的路由模式

第一步:全局安装hmrouter依赖

ohpm install @hadss/hmrouter

第二步:修改全局的hvigor-config.json5(加入hm-router插件)

hvigor/hvigor-config.json5

{"modelVersion": "5.0.1","dependencies": {"@hadss/hmrouter-plugin": "^1.0.0-rc.10"},"execution": {// "analyze": "normal",                     /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */// "daemon": true,                          /* Enable daemon compilation. Value: [ true | false ]. Default: true */// "incremental": true,                     /* Enable incremental compilation. Value: [ true | false ]. Default: true */// "parallel": true,                        /* Enable parallel compilation. Value: [ true | false ]. Default: true */// "typeCheck": false,                      /* Enable typeCheck. Value: [ true | false ]. Default: false */},"logging": {// "level": "info"                          /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */},"debugging": {// "stacktrace": false                      /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */},"nodeOptions": {// "maxOldSpaceSize": 8192                  /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/// "exposeGC": true                         /* Enable to trigger garbage collection explicitly. Default: true*/}
}

第三步:在products成加入hap编译插件
需要注意hap/hsp/har对应的编译插件不同

products/entry/hvigorfile.ts

import { hapTasks } from '@ohos/hvigor-ohos-plugin';
import { hapPlugin } from "@hadss/hmrouter-plugin";export default {system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */plugins: [hapPlugin()] // 使用HM Custom plugin to extend the functionality of Hvigor. */
}

第四步:在features的四个包中加入hsp的编译插件-四个hsp包的hvigorfile.ts插件均一致

features/cart/hvigorfile.ts

import { hspTasks } from '@ohos/hvigor-ohos-plugin';
import { hspPlugin } from "@hadss/hmrouter-plugin";export default {system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */plugins: [hspPlugin()]         /* Custom plugin to extend the functionality of Hvigor. */
}

补充:为了防止底层basic也有可能做一些公共页面,也加入同样的配置

commons/basic/hvigorfile.ts

import { hspTasks } from '@ohos/hvigor-ohos-plugin';
import { hspPlugin } from "@hadss/hmrouter-plugin";export default {system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */plugins: [hspPlugin()]         /* Custom plugin to extend the functionality of Hvigor. */
}

第五步:在入口Ability中加入HmRouter的初始化上下文

products/entry/src/main/ets/entryability/EntryAbility.ets

import { HMRouterMgr } from '@hadss/hmrouter';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 初始化HmRouterHMRouterMgr.init({context: this.context,});this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}

最后一步:

定义路由入口
将整个页面的初始化页面作为路由的入口
要求:
●使用HmNavigation作为根容器,包裹所有子页面
●HmNavigaiton外层必须再包裹一个容器组件
●实现一个继承类并且实例化,绑定HmNavigaiton的modifer属性
●使用HmNavigation包裹入口组件

import { HomeView } from 'home/Index';
import { CategoryView } from 'category/Index';
import { CartView } from 'cart/Index';
import { MyView } from 'my/Index';
import { BreakpointConstants, BreakPointType, MeiKouConstants } from 'basic';
import { AttributeUpdater } from '@kit.ArkUI';
import { HMDefaultGlobalAnimator, HMNavigation } from '@hadss/hmrouter';interface TabItem {text: stringnormal: ResourceStractive: ResourceStr
}class MyNavModifier extends AttributeUpdater<NavigationAttribute> {initializeModifier(instance: NavigationAttribute): void {instance.titleMode(NavigationTitleMode.Mini)instance.hideTitleBar(true)}
}@Entry
@Component
struct Index {@State activeIndex: number = 0// 断点值@StorageProp(BreakpointConstants.BREAK_POINT_KEY)currentBreakpoint: string = BreakpointConstants.SM// 获取底部安全高度@StorageProp(MeiKouConstants.SafeBottom) safeBottom: number = 0modifier: MyNavModifier = new MyNavModifier();list: TabItem[] = [{ text: '首页', normal: $r('app.media.ic_public_home_normal'), active: $r('app.media.ic_public_home_active') },{ text: '分类', normal: $r('app.media.ic_public_pro_normal'), active: $r('app.media.ic_public_pro_active') },{ text: '购物袋', normal: $r('app.media.ic_public_cart_normal'), active: $r('app.media.ic_public_cart_active') },{ text: '我的', normal: $r('app.media.ic_public_my_normal'), active: $r('app.media.ic_public_my_active') },]build() {Column() {HMNavigation({navigationId: 'mainNavigation', homePageUrl: 'MainPage',options: {standardAnimator: HMDefaultGlobalAnimator.STANDARD_ANIMATOR,dialogAnimator: HMDefaultGlobalAnimator.DIALOG_ANIMATOR,modifier: this.modifier},}) {Tabs({ barPosition: BarPosition.End }) {ForEach(this.list, (item: TabItem, index: number) => {TabContent() {if (index == 0) {HomeView()} else if (index == 1) {CategoryView()} else if (index == 2) {CartView()} else {MyView()}}.tabBar(this.TabItemBuilder(item, index))})}.barPosition(new BreakPointType({sm: BarPosition.End,md: BarPosition.End,lg: BarPosition.Start}).getValue(this.currentBreakpoint)).vertical(this.currentBreakpoint === 'lg' ? true : false).scrollable(false).padding({bottom: this.safeBottom}).onTabBarClick(index => {this.activeIndex = index})}}}@BuilderTabItemBuilder(item: TabItem, index: number) {Column() {Image(this.activeIndex === index ? item.active : item.normal).width(24).aspectRatio(1)Text(item.text).fontSize(12).fontColor($r('[basic].color.black'))}.justifyContent(FlexAlign.SpaceEvenly).height(50)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个Pyside6实现web数据展示界面的效果图

今天又是有问题直接找DS的一天&#xff0c;每日一问&#xff0c;今天我的问题是“怎么将pyside6生成的界面转成web界面&#xff0c;使用python语言实现web界面”&#xff0c;等了一会&#xff0c;DS给我提供了两种方案&#xff0c;方案如下&#xff1a; 然后&#xff0c;让我们…

GAMMA数据处理(十)

今天向别人请教了一个问题&#xff0c;刚无意中搜索到了一模一样的问题 不知道这个怎么解决... ok 解决了 有一个GAMMA的命令可转换 但是很奇怪 完全对不上 转换出来的行列号 不知道为啥 再试试 是因为经纬度坐标的小数点位数 de as

[从零开始学习JAVA ] 深入多线程

前言&#xff1a; 当今软件开发领域中&#xff0c;多线程编程已成为一项至关重要的技能。然而&#xff0c;要编写出高效、可靠的多线程程序并不容易。多线程编程面临着许多挑战&#xff0c;如线程安全性、资源共享、死锁等问题。因此&#xff0c;对于初学者来说&#xff0c;深入…

【Python NetworkX】图结构 图绘制

【Python NetworkX】图结构 & 图绘制 1. 简介 & 安装1.1 简介1.2 安装1.3 导入 2. 图2.1 无向图2.2 有向图2.3 重边无向图2.4 重边有向图2.5 图属性 3. 节点3.1 添加节点3.2 移除节点3.3 节点属性3.4 检查节点状态 4. 边4.1 添加边4.2 移除边4.3 边属性4.4 检查边状态 …

Kubernetes》k8s》Containerd 、ctr 、cri、crictl

containerd ctr crictl ctr 是 containerd 的一个客户端工具。 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。 ctr -v 输出的是 containerd 的版本&#xff0c; crictl -v 输出的是当前 k8s 的版本&#x…

【湖北工业大学2025年ACM校赛(同步赛)】题解

比赛链接 A. 蚂蚁上树 题目大意 给定一棵 n n n 个结点的树&#xff0c;根结点为 1 1 1。每个 叶结点 都有一只蚂蚁&#xff0c;每过 1 1 1 秒钟&#xff0c;你可以选一些蚂蚁往其 父结点 走一步&#xff0c;但是要求任意两只蚂蚁都不能在同一个 非根结点 上。 问至少要…

CS2 DEMO导入blender(慢慢更新咯)

流程&#xff1a;cs2-sourcefilmmaker-blender 工具&#xff1a;cs2tools&#xff0c;cs2manager&#xff0c;blender&#xff0c;blender插件sourceio&#xff0c;source2viewer 导入sfm 工具界面 选择这个 sourceio插件 sourceIO其中新版本导入相机路径不见了&#xff0c…

一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的&#xff0c;当你添加了新的模型类&#xff0c;或是在模型类中添加了新的字段&#xff0c;甚至是修改…

Postman CORS 测试完全指南:轻松模拟跨域请求,排查 CORS 相关问题

在使用 Postman 进行 API 测试时&#xff0c;通常不会遇到跨域问题&#xff0c;因为 Postman 是一个独立的客户端应用程序&#xff0c;不同于在浏览器中运行的 JavaScript 代码&#xff0c;它没有同源策略&#xff08;SOP&#xff09;的限制。跨域资源共享&#xff08;CORS&…

【图像处理基石】什么是refocus?

1. Refocus 的定义 Refocus&#xff08;重新对焦&#xff09;是一种通过算法调整图像或视频焦点的技术&#xff0c;允许用户在拍摄后选择焦点&#xff0c;实现类似光场相机的“先拍照后对焦”效果。其核心是通过多视角信息或深度估计&#xff0c;生成不同焦平面的图像&#xff…

kettle从入门到精通 第九十三课 ETL之kettle kettle 调用web service接口5种方法,一文彻底搞懂

场景&#xff1a;群里有小伙伴向我求助如何调用web service接口&#xff0c;趁着周末时间&#xff0c;给兄弟们搞demo。 1、本次使用的web service服务接口地址是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?opgetSupportCityDataset&#xff0c; 此接口根据用户输入…

电子电气架构 --- 域控架构下,汽车连接器的挑战和变化

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

[MySQL] 库的操作 表的操作

1.库的操作 1.创建数据库 这里就是一个创建数据库的例子&#xff0c;框内的东西可以不填&#xff0c;因为有默认设置&#xff0c;而这些东西是什么呢&#xff1f; 2.字符集和校验规则 2.1查看字符集校验规则 show variables like ‘character_set_database’; show variable…

Let’s Encrypt 宣布推出短期证书与 IP 地址支持,推动 Web 安全迈向新高度

2025 年 1 月 16 日&#xff0c;全球领先的免费 SSL/TLS 证书颁发机构 Let’s Encrypt 正式宣布两项重大功能更新计划&#xff1a;推出六天有效期证书&#xff08;Short-Lived Certificates&#xff09;及支持以 IP 地址为主体的证书申请。两项功能将于 2025 年起陆续开放&…

十二、Cluster集群

目录 一、集群简介1、现状问题2、集群作用 二、集群结构设计1、集群存储设2、消息通信设计 三、Cluster集群三主三从结构搭建1、redis.conf配置文件可配置项2、配置集群3、链接集群4、命令客户端连接集群并使用 四、集群扩容1、添加节点2、槽位分配3、添加从节点 五、集群缩容1…

Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束

收尾 进程终止&#xff1a;子进程通过exit()或_exit()终止&#xff0c;父进程通过wait()或waitpid()等待子进程终止&#xff0c;并获取其退出状态。&#xff1f;其实可以考虑在另一篇博文中来写 fork函数讲解 fork函数概述 fork() 是 Linux 中用于创建新进程的系统调用。当…

【AI论文】挑战推理的边界:大型语言模型的数学基准测试

摘要&#xff1a;近年来&#xff0c;大型推理模型的迅猛发展导致现有用于评估数学推理能力的基准测试趋于饱和&#xff0c;这凸显出迫切需要更具挑战性和严谨性的评估框架。为填补这一空白&#xff0c;我们推出了OlymMATH&#xff0c;这是一项全新的奥林匹克级数学基准测试&…

典范硬币系统(Canonical Coin System)→ 贪心算法

【典范硬币系统】 ● 典范硬币系统&#xff08;Canonical Coin System&#xff09;是指使用贪心算法总能得到最少硬币数量解‌的货币面值组合‌。 ● 给定一个硬币系统 &#xff0c;若使其为典范硬币系统&#xff0c;则要求其各相邻面值比例 &#xff0c;及各开区间 内各金额…

Android7 Input(二)Linux 驱动层输入事件管理

概述 在Linux系统中&#xff0c;将键盘&#xff0c;鼠标&#xff0c;触摸屏等这类交互设备交由Linux Input子系统进行管理&#xff0c;Linux Input驱动子系统由于具有良好的和用户空间交互的接口。因此Linux Input驱动子系统&#xff0c;不止于只管理输入类型的设备。也可以将其…

高清壁纸一站式获取:海量分类,免费无弹窗

软件介绍 在如今这个追求个性化与高品质视觉体验的时代&#xff0c;一款出色的壁纸应用无疑能为我们的电子设备增添别样魅力。此刻&#xff0c;要给大家重磅推荐的便是Wallpaper这款应用&#xff0c;它犹如一个绚丽多彩的壁纸宝库&#xff0c;全方位满足你的审美需求。 海量壁…