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

【HarmonyOS NEXT】实现跨工程模块跳转

一、背景

公司鸿蒙项目采用壳工程 + 功能模块拆分为独立工程的架构模式,既实现代码解耦,也方便多团队并行开发,但独立工程之间无法直接引用源码,那就要考虑如何实现 “主工程按钮点击跳转到功能工程的页面”问题,通过以下案例来实现这个思路步骤

二、前置了解

先了解几个鸿蒙的核心概念

1、HAR 包:鸿蒙的 “模块归档包”,包含代码、资源、依赖的独立单元,是跨工程依赖的唯一载体;

2、跨工程依赖:主工程通过依赖功能工程的 HAR 包 / 本地模块,间接访问其组件;

3、NavPathStack:鸿蒙原生全局路由栈,是承载所有页面(包括跨工程页面)的容器。

三、具体流程

案例:lucyTest工程→loginTest 工程 login模块,跨工程跳转

主要分为三部分:发送方(lucyTest 主工程)配置,接收方(loginTest 登录工程)配置,跳转逻辑实现

3.1、接收方

3.1.1、准备可被跳转的模块

在loginTest工程内新建login模块可被其他工程依赖,并提供可跳转的页面(loginPage.ets)

目的:定义跨工程跳转的目标页面组件,后续通过路由映射让主工程识别。

3.1.2、配置路由表

loginTestlogin模块中,创建route_map.json

目的:鸿蒙路由系统通过route_map.json识别页面的 “唯一标识(name)” 与 “渲染入口”,是跨工程跳转的 “页面身份证”。

具体使用方法可参考此文章:https://blog.csdn.net/weixin_71403100/article/details/154455692?spm=1001.2014.3001.5502

{ "routerMap": [ { "name": "loginPage", "pageSourceFile": "src/main/ets/_generated/BuilderMap.ets", "buildFunction": "loginPageBuilder", "data": { "needLogin": "false" } } ] }

3.1.3、生成页面构建器:统一页面入口

loginTestlogin模块中,创建BuilderMap.ets,定义页面的构建函数

目的:将页面组件封装为@Builder函数,匹配route_map.json中的buildFunction,让路由系统能直接调用渲染页面。

备注:当路由页面少时这一步可以直接放到第一步中,当大型项目页面多时,建议抽成一个文件,在index中统一导出

3.1.4、导出模块入口:对外暴露能力

在login 模块 index.ets 导出目标组件

目的:主工程依赖模块后,通过index.ets统一访问模块的能力(页面、方法)。

//路径: /loginTest/login/Index.ets export * from './src/main/ets/_generated/BuilderMap'

3.1.5、将login模块打包为HAR包

3.2、发送方

3.2.1、引入 login 模块:本地依赖 / HAR 包依赖二选一

方式1:本地路径依赖(工程在同一目录下)

1、在lucyTestbuild-profile.json5中注册login模块:

2、在lucyTestoh-package.json5中声明依赖:

方式 2:HAR 包依赖

login模块的 HAR 包放入lucyTestlibs目录,再在oh-package.json5中依赖:

执行ohpm install安装依赖,主工程即可访问login模块的能力。

3.2.2 初始化 login 模块:动态导入 + 传递上下文

lucyTestEntryAbility.ets中,动态导入login模块并执行初始化(传递主工程上下文):

3.2.3、配置全局路由栈:承载跨工程页面的容器

lucyTest的跳转页面(如Index.ets)中,创建全局唯一的 NavPathStack(鸿蒙原生路由栈,所有页面都需通过它跳转):

// lucyTest/entry/src/main/ets/pages/Index.ets @Entry @Component struct Index { // 全局路由栈:承载主工程+跨工程的页面 private globalNavStack: NavPathStack = new NavPathStack(); build() { Column(){ // Navigation绑定全局路由栈(页面跳转的容器) Navigation(this.globalNavStack){ // 跳转按钮 Button('跳转到login组件') .onClick(()=>{ // 后续实现跳转逻辑 }) } .height('100%') .width('100%') } } }

3.3、实现跨工程跳转逻辑

lucyTestIndex.ets按钮点击事件中,调用NavPathStack.pushPathByName,通过loginPage路由名称跳转:

目的:通过route_map.json中注册的loginPage名称,让路由系统找到对应的页面构建函数,渲染跨工程的loginPage组件。

// lucyTest/entry/src/main/ets/pages/Index.ets Button('跳转到login组件') .onClick(()=>{ // 跳转到login模块的loginPage页面 this.globalNavStack.pushPathByName('loginPage', null, false); })

四、技能总结

主要使用到:

Navigation路由导航

HAR包跨工程依赖

动态导入 + harInit

五、会遇到的坑

以下是因为粗心大意而遇到的坑,总结下以免后续再犯

1、主工程找不到 login 模块

检查build-profile.json5/oh-package.json5的路径是否正确;执行ohpm install

2、跳转过去是个空白

检查路由表信息的配置项是否正确,检查是否绑定NavPathStack

3、harInit方法未找到

检查login模块的index.ets是否导出了harInit

http://www.cnnetsun.cn/news/181070.html

相关文章:

  • 网络安全核心基础百问百答:你的第一本实用安全速查手册
  • 揭秘Open-AutoGLM如何拯救非遗文化:5大核心技术首次公开
  • 揭秘Open-AutoGLM底层架构:如何实现高质量文创内容自动生成
  • 收藏!大模型学习实战指南:从入门到进阶,小白/程序员少走90%弯路
  • 收藏!2025年AI行业风口:应用层人才成企业争抢核心,程序员/小白入门指南
  • 你不知道的Open-AutoGLM黑科技(5个隐藏功能让城市管理效率提升300%)
  • 传奇手游快速挂机 巨 椰 云手机
  • AbMole小课堂:类器官培养中决定成败的抑制剂、细胞因子
  • Vue基础入门08,详解 Vue watch 侦听器:基础用法、深度监听与立即执行场景
  • 怎样选择品牌代工厂?不要只关注价格,这5点才是关键
  • 一键群控多台电脑,狂揽 2.2 万 GitHub Star!
  • Open-AutoGLM模型压缩技术揭秘:在边缘设备上实现毫秒级推理的6种方法
  • Open-AutoGLM部署避坑指南,20年架构师亲授高可用场景适配秘诀
  • 为什么说Open-AutoGLM是首个真正具备自主学习能力的开源框架?
  • 一篇文章熟悉Java打包到部署
  • 数据结构 —— 顺序表
  • 基于springboot的大创管理系统(11549)
  • springboot基于安卓的老年养护与智能服务系统
  • EasyGBS助力智慧医院打造全方位视频监控联网服务体系
  • 【收藏级】全面拆解GraphRAG:从原理到实践,大模型知识库升级必备
  • Java多态——Java的三大特性之一,零基础小白到精通,收藏这篇就够了
  • 【Open-AutoGLM元宇宙适配终极指南】:揭秘三大核心技术突破与落地实践
  • Open-AutoGLM如何实现自主学习?:深度剖析其进化机制与训练闭环设计
  • [驱动之路——GPIO子系统]学习总结,万字长篇,一文彻底搞懂GPIO子系统(含GPIO控制器驱动框架解析)
  • Open-AutoGLM如何重塑城市治理?:3个真实案例揭示AI协同调度的颠覆性力量
  • 智能体式AI实战指南:从零构建IT自动化系统,程序员必学收藏教程
  • 家长用Realme手机,怎样远程管理孩子iPhone的屏幕使用时长?
  • 【Open-AutoGLM智慧城市协同调度】:揭秘未来城市交通智能调度的5大核心技术
  • Java SpringBoot+Vue3+MyBatis 宠物爱心组织管理系统系统源码|前后端分离+MySQL数据库
  • 【Open-AutoGLM自动驾驶交互核心技术】:揭秘AI驱动的车载人机协同新范式