前言
服务路由主要用于实现模块之间的通信,模块间是相互独立且不直接依赖于彼此。
首先确保路由插件在1.0.9版本及以上
一、添加配置
1、在entry模块的build-profile.json5
文件的 buildOption 下配置需要动态import加载的模块,如下:
注意:是在buildOption节点下设置,不是buildOptionSet
"buildOption": {
"arkOptions": {
"runtimeOnly": {
// 配置本模块变量动态import其他模块名,要求与dependencies中配置的名字一致。
"packages": [ "hara","harb","hspc" ]
}
}
}
二、初始化
在EntryAbility的onCreate()方法中初始化:
ZRouter.initialize((config) => {
config.isLoggingEnabled = BuildProfile.DEBUG
config.isHSPModuleDependent = true
config.loadDynamicModule = ['hara', 'harb', 'hspc']
config.onDynamicLoadComplete = () => {
console.log("已完成所有模块的加载")
}
})
初始化配置参数说明如下:
interface IConfigOptions {
/**
* 是否有依赖hsp模块
*/
isHSPModuleDependent: boolean
/**
* 是否打印日志
*/
isLoggingEnabled: boolean
/**
* 指定动态加载的模块名称,用于服务路由自动注册
* 必须与dependencies的依赖名称保持一致
*/
loadDynamicModule: string[]
/**
* 延迟动态加载的时间,单位毫秒
*/
dynamicLoadDelayTime: number
/**
* 动态加载完成后回调函数
*/
onDynamicLoadComplete?: () => void
}
到这里已完成了服务路由的初始化。
三、基本使用
1、在业务公共common模块定义下沉接口,需要继承与IProvider接口
import { IProvider } from "@hzw/zrouter";
export interface IHarAService extends IProvider {
showToast(msg: string): void
getUserInfo(): Promise<string>
}
记得在common模块的Index.ets文件导出这些下沉接口。
2、在业务模块(harA)实现IHarAService接口
import { Service } from "routerapi";
import { promptAction } from "@kit.ArkUI";
import { IHarAService, RouterConstants } from "common_library";
@Service({ name: RouterConstants.SERVICE_HARA_IMPL })
export class HarAServiceImpl implements IHarAService {
showToast(msg: string): void {
promptAction.showToast({ message: msg })
}
getUserInfo(): Promise<string> {
return new Promise<string>((resolve, reject) => {
resolve("hello harmonyos")
})
}
}
实现类必须通过@Service注解进行标注,支持常量设置, 常量必须以类的方式管理 ,export导出暂不支持default声明。
3、在业务模块(harB)中调用,通过ZRouter的getService()方法获取定义的服务实例,代码如下:
Button('模块间通信-调用harA模块的异步方法').onClick((event: ClickEvent) => {
ZRouter.getService<IHarAService>(RouterConstants.SERVICE_HARA_IMPL)?.getUserInfo().then((r)=>{
console.log("调用harA模块的异步方法: ", r)
promptAction.showToast({ message: "来自harA的数据: " + r })
})
})
Button('模块间通信-调用harA模块的同步方法').onClick((event: ClickEvent) => {
ZRouter.getService<IHarAService>(RouterConstants.SERVICE_HARA_IMPL)?.showToast("hello ZRouter!")
})
Button('模块间通信-调用hspC模块的异步方法').onClick((event: ClickEvent) => {
ZRouter.getService<IHspCService>(RouterConstants.SERVICE_HSPC_IMPL)?.getDataFromHspC().then((r) => {
promptAction.showToast({ message: r })
})
})