React Native跨平台鸿蒙开发高级应用原理:RNOH框架中的RNInstancesCoordinator模块的配置代码
摘要:本文介绍了React Native ArkUI中TurboModule相关API的变更与使用说明。包括已废弃的createTurboModulesFactory、createUITurboModuleFactory和createWorkerTurboModuleFactory方法,推荐使用新的getUITurboModuleFactoryByNameMap和createEagerUITurb
createTurboModulesFactory(ctx)(deprecated)
createTurboModulesFactory(ctx: UITurboModuleContext): TurboModulesFactory
创建TurboModule工厂,从 RNOHVersion 0.72.38 开始废弃,使用createUITurboModuleFactory代替。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ctx | UITurboModuleContext | 是 | UITurboModule上下文对象 |
createUITurboModuleFactory(deprecated)
createUITurboModuleFactory(ctx: UITurboModuleContext): UITurboModuleFactory
创建TurboModule工厂,从 RNOHVersion 0.72.38 开始废弃,使用getUITurboModuleFactoryByNameMap 和 createEagerUITurboModuleByNameMap代替。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ctx | UITurboModuleContext | 是 | UITurboModule上下文对象 |
createWorkerTurboModuleFactory(deprecated)
createWorkerTurboModuleFactory(ctx: WorkerTurboModuleContext): WorkerTurboModuleFactory | null
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ctx | WorkerTurboModuleContext | 是 | WorkerTurboModule上下文对象 |
getUITurboModuleFactoryByNameMap
getUITurboModuleFactoryByNameMap(): Map<string, (ctx: UITurboModuleContext) => UITurboModule | null>
通过此方法获取Factory工厂类,返回一个模块工厂映射表,此方法在UI线程中使用。
getAnyThreadTurboModuleFactoryByNameMap
getAnyThreadTurboModuleFactoryByNameMap(): Map<string, (ctx: AnyThreadTurboModuleContext) => AnyThreadTurboModule | null>
通过此方法获取Factory工厂类,返回一个模块工厂映射表,此方法在worker线程中使用。
createEagerUITurboModuleByNameMap
createEagerUITurboModuleByNameMap(ctx: UITurboModuleContext): Promise<Map<string, UITurboModule>>
创建TurboModule 映射表,注册需要在应用启动时立即创建的UI线程TurboModule。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ctx | UITurboModuleContext | 是 | UITurboModule上下文对象 |
createEagerAnyThreadTurboModuleByNameMap
createEagerAnyThreadTurboModuleByNameMap(ctx: AnyThreadTurboModuleContext): Promise<Map<string, AnyThreadTurboModule>>
创建TurboModule 映射表,注册需要在应用启动时立即创建的worker线程TurboModule。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ctx | string | 是 | AnyThreadTurboModule上下文对象 |
createSurface
createSurface(appKey: string): SurfaceHandle
由 RNSurface 使用,会在 React Native 中创建一个 Surface。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 开发者在JS侧使用AppRegistry.registerComponent注册的名称。 |
updateState
updateState(componentName: string, tag: Tag, state: unknown): void
向 ComponentNapiBinder.h::updateState 发送状态更新请求,更新 C++ 端状态。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| componentName | string | 是 | 组件名称。 |
| tag | Tag | 是 | 组件Tag。 |
| state | unknown | 是 | 要更新的状态。 |
bindComponentNameToDescriptorType
bindComponentNameToDescriptorType(componentName: string, descriptorType: string)
将 Descriptor 类型和组件名进行关联,用于将核心组件替换为自定义组件。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| componentName | string | 是 | 组件名称。 |
| descriptorType | string | 是 | 为给定的descriptorType在ComponentBuilderContext中提供的值。 |
getComponentNameFromDescriptorType
getComponentNameFromDescriptorType(descriptorType: string): string
根据 Descriptor 类型获取组件名称。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| descriptorType | string | 是 | Descriptor类型。 |
blockComponentsGestures
blockComponentsGestures(targetComponentTag: Tag): (() => void)
阻止 targetComponent 及其祖先组件中的手势。由 react-native-gesture-handler 在 RNScrollView 或其他可滚动组件中平移时使用。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| targetComponentTag | Tag | 是 | 目标组件的Tag。 |
返回
返回一个可以抵消这个效应的方法。
getInitialBundleUrl
getInitialBundleUrl(): string | undefined
返回第一个加载的 JS Bundle URL。SourceCodeTurboModule 使用这个方法来生成正确的堆栈跟踪。有些应用将它们捆绑包分开来提高启动性能,因此有了“初始”这个词。
getAssetsDest
getAssetsDest(): string
返回 assets 资源的路径。
postMessageToCpp
postMessageToCpp(name: string, payload: any)
ArkTS 向 C++ 端发送消息。由 ArkTSMessageHub:Observer 或 ArkTSMessageHandler 处理。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 消息名称。 |
| payload | any | 是 | 发送的数据。 |
registerFont
registerFont(fontFamily: string, fontResource: Resource | string): void
注册字体。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fontFamily | string | 是 | 字体名。 |
| fontResource | Resource / string | 是 | 字体资源对象,或字体资源文件的沙箱路径。 |
setAttachedLabel
setAttachedLabel(attachedLabel: string): void
将一段开发者自定义的字符串标签挂载到当前 RNInstance。
之后该实例通过 reportRNOHError 上报的错误中,会自动带上该标签(用于快速关联具体 bundle / 场景),便于在日志与订阅回调中定位来源。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| attachedLabel | string | 是 | 要绑定到当前实例的自定义标签文本;超过 256 字符将触发 warning 日志并被截断。 |
getAttachedLabel
getAttachedLabel(): string
返回当前 RNInstance 上通过 setAttachedLabel方法设置的自定义标签。
RNOHCoreContext
基本介绍
RNOHCoreContext 提供可跨 RNInstances 共享的依赖项和实用程序。还包括创建和销毁RNInstance 的方法,对于特定于 RNInstance 的方法。本节主要介绍了 RNOHCoreContext 的接口类型。
关键参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| uiAbilityContext | common.UIAbilityContext | UIAbility的上下文。 |
| safeAreaInsetsProvider | SafeAreaInsetsProvider | SafeAreaInsets 提供者,SafeAreaInsets 提供了与屏幕边缘的距离,可以用来避免在状态栏、缺口或瀑布边缘下面呈现的内容。 |
| isDebugModeEnabled | boolean | React Native 是否使用 Debug 模式。 |
| launchUri | string | undefined | ArkUI::Want::uri,应用自己的uri。 |
关键方法
createAndRegisterRNInstance
createAndRegisterRNInstance: (options: RNInstanceOptions, frameNodeFactory?: FrameNodeFactory) => Promise<RNInstance>
创建 RNInstance 并将其注册到 RNOH 的内部注册表中。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| options | RNInstanceOptions | 是 | RNInstance 的参数选项。 |
| frameNodeFactory | FrameNodeFactory | 是 | 由 RNSurface 实例化的内部类。 |
destroyAndUnregisterRNInstance
destroyAndUnregisterRNInstance: (rnInstance: RNInstance) => void
销毁 RNInstance 并从 RNOH 的内部注册表中注销。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| rnInstance | RNInstance | 是 | 要销毁的 RNInstance。 |
getDisplayMetrics
getDisplayMetrics: () => DisplayMetrics
返回当前屏幕信息。
getUIAbilityState
getUIAbilityState: () => UIAbilityState
返回应用程序的当前状态。
dispatchBackPress
dispatchBackPress: () => void
用 root ArkUI 组件的 onBackPress 调用,目前这是 BackPress 的唯一响应方式。
reportRNOHError
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| rnohError | RNOHError | 是 | 上报的错误 |
上报 RNOH 错误用于监听。
RNComponentContext
RNComponentContext 是 React Native for OpenHarmony 构造组件时使用的上下文信息,是 RNOHContext 的子类。
constructor
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| rnohContext | RNOHContext | 是 | 用于组件或TurboModule使用的上下文信息。 |
| wrappedCustomRNComponentBuilder | WrappedCustomRNComponentBuilder | 是 | 用于构造ArkTS侧自定义组件的构造器。 |
| wrappedRNComponentBuilder | WrappedRNComponentBuilder | 是 | 用于构造 ArkTS 侧 RN 子组件的构造器。 |
| rnComponentDataSourceFactoriesByDescriptorType | Map<string, RNComponentDataSourceFactory> | 是 | 用来存储 LazyForEach 的 DataSource 对象。 |
方法
runOnWorkerThread<TParams, TResult, TRunnable>(runnable, params)
| 泛型类型 | 继承父类型 | 必填 | 说明 |
|---|---|---|---|
| TParams | SupportedTaskParams | 是 | 参数类型, 受 WORKER 线程通信机制限制,必须为可序列化类型。 |
| TResult | lang.ISendable | void | 是 | 返回值类型, 受 WORKER 线程通信机制限制,必须为可序列化类型。 |
| TRunnable | WorkerTaskRunnable<TParams, TResult> | 是 | 可执行任务对象类型。 |
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| runnable | TRunnable | 是 | 可执行任务对象。 |
| params | TParams | 是 | 可执行任务参数。 |
以params作为参数,在WORKER 线程并行执行runnable.run(),返回一个Promise<TResult>对象,可用于读取runnable.run()的返回值。
使用本特性前需启用WORKER 线程特性。如何启用WORKER 线程特性详见架构介绍.md#worker线程。
使用示例详见常见开发场景.md#如何在worker-线程并行执行自定义任务。
EtsUITurboModuleContext
EtsUITurboModuleContext 是 React Native for OpenHarmony 构造EtsUITurboModule时使用的上下文信息,是 RNOHContext 的子类。
方法
runOnWorkerThread<TParams, TResult, TRunnable>(runnable, params)
同上文API接口说明.md#runonworkerthreadtparams-tresult-trunnablerunnable-params。
JSBundleProvider
基础介绍
JS Bundle 提供者,用于初始化 bundle 信息,获取 bundle 具体内容。本节主要介绍了 RNOHCoreContext 的接口类型。
类型
AnyJSBundleProvider
所有 bundle 的加载器,从小到大依次加载。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| jsBundleProviders | JSBundleProvider[] | 是 | JSBundleProvider 数组,可以传入多个 JS Bundle Provider。 |
MetroJSBundleProvider
使用 Metro 服务加载 bundle。
FileJSBundleProvider
从沙箱目录下加载 bundle。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 文件地址。 |
| appKeys | string[] | 否 | 开发者在JS侧使用AppRegistry.registerComponent注册的名称数组。 |
ResourceJSBundleProvider
从资源文件中加载 bundle,专指 resources/rawfile 下的 bundle 文件。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| resourceManager | resmgr.ResourceManager | 是 | 资源管理对象。 |
| path | string | 是 | bundle文件名。 |
| appKeys | string[] | 否 | 开发者在 JS 侧使用 AppRegistry.registerComponent 注册的名称。 |
RNInstancesCoordinator
基本介绍
RNAbility 大部分代码由 RNOH 实现,以提高稳定性。这类项目不使用 RNAbility 和 RNApp。为此,React Native for OpenHarmony 提供了 RNInstancesCoordinator 给开发者,旨在更加灵活的控制 RN 的启动,
方法
create
static create(dependencies: RNInstancesCoordinatorDependencies, options?: RNInstancesCoordinatorOptions)
根据给定的 RNInstancesCoordinatorDependencies 与 RNInstancesCoordinatorOptions 返回 RNInstancesCoordinator 的对象。
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dependencies | RNInstancesCoordinatorDependencies | 是 | 用于构建 RNInstancesCoordinator 时使用的依赖。 |
| options | RNInstancesCoordinatorOptions | 否 | 构建 RNInstancesCoordinator 时使用的选项。 |
onDestroy
rnInstancesCoordinator?.onDestroy(): void
onDestroy 方法在 UIAbility 实例销毁时调用,进入 RN。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。
getBuildMode
rnInstancesCoordinator?.getBuildMode(): BuildMode
获取项目的构建方式: ‘RELEASE’ 或 ‘DEBUG’;
getRNOHCoreContext
rnInstancesCoordinator?.getRNOHCoreContext(): RNOHCoreContext
获取 RNInstancesCoordinator 实例的 RNOHCoreContext;
onForeground
rnInstancesCoordinator?.onForeground(): void
开发者应在onForeground在 UIAbility 实例切换至前台时调用该方法,向 React 侧通知应用已经从后台切换至前台。
onBackground
rnInstancesCoordinator?.onBackground(): void
开发者应在onBackground在UIAbility实例切换至后台时调用该方法,向 React 侧通知应用已经从前台切换至后台。
onWindowStageChange
rnInstancesCoordinator?.onWindowStageChange(windowStageEvent: window.WindowStageEventType): void
开发者需要监听windowStageEvent事件,并调用该方法,向 React 侧通知 WindowStage 生命周期变化。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| windowStageEvent | WindowStageEventType | 是 | WindowStage 类型。 |
onWindowSizeChange
rnInstancesCoordinator?.onWindowSizeChange(windowSize: window.Size): void
开发者需要监听windowSizeChange事件,并调用该方法,向 React 侧通知窗口尺寸变化。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| windowSize | Size | 是 | 更改后的窗口大小。 |
onConfigurationUpdate
rnInstancesCoordinator?.onConfigurationUpdate(systemConfiguration: AbilityConfiguration.Configuration): void
开发者应在系统配置发生变化时调用该方法,通知 React Native for openHarmony 系统相关设置已经发生了变化。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| systemConfiguration | Configuration | 是 | 当系统配置发生变化,向 React Native for OpenHarmony 通知。 |
onMemoryLevel
rnInstancesCoordinator?.onMemoryLevel(memoryLevel: number): void
开发者应在内存到达不同级别时,调用该方法,向 React Native 通知。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| memoryLevel | AbilityConstant.MemoryLevel | 是 | 通知 React Native 内存级别发生改变。 |
onNewWant
rnInstancesCoordinator?.onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void
开发者需要在 UIAbility 实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该 UIAbility 实例时会回调执行的 UIAbility.onNewWant 中调用该方法。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| want | Want | 是 | Want 类型参数,如 ability 名称,包名等。 |
| launchParam | AbilityConstant.LaunchParam | 是 | UIAbility 启动的原因、上次异常退出的原因信息。 |
RNInstancesCoordinatorDependencies
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fontSizeScale | number | undefined | 是 | 字体大小缩放比例,值为 1 的时候为正常大小字体,小于1缩小,大于 1 放大。 |
| logger | RNOHLogger | 是 | 用于打印日志。 |
| uiAbilityContext | UIAbilityContext | 是 | 使用 React Native 的 Ability 的上下文信息。 |
| rnohWorkerScriptUrl | string | 否 | 部分TurboModule需要启动Worker线程才可以正常启用,需要设置该属性,启用对应 name 的 RNInstance 的 Worker 线程。 |
| defaultBackPressHandler | Function | 是 | React 侧执行的 exitApp 的原生侧实现。 |
RNInstancesCoordinatorOptions
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| launchURI | string | 否 | Linking.getInitialURL()获取到的初始URL。 |
| onGetPackagerClientConfig | (buildMode: BuildMode) => JSPackagerClientConfig | undefined | 否 | 返回Metro配置的函数。 |
| defaultHttpClient | HttpClient | 否 | 用于在 RN 与原生混合的应用中,重用 Cookies 或打印日志。 |
| disableCleaningRNInstances | boolean | 否 | 是否启用 CleanUP 线程,清理 RN 实例。 |
setupRNOHWorker
基本介绍
TurboModule 可配置为运行在 Worker 线程中,配置需通过 RNOHWorker.ets 文件调用 setupRNOHWorker 方法实现。关于具体操作步骤,可参考 TurboModule.md 文档中 “设置自定义 TurboModule 运行在 Worker 线程” 栏目。
更多推荐


所有评论(0)