HarmonyOS 如何让RN的项目调用到HarmonyOS的方法

HarmonyOS
2024-12-11 14:12:45
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

js给native发消息需要用到TurboModule模块,它可以通过React Native的「Bridge」帮助JavaScript和原⽣代码进⾏交互,并使⽤跨平台的数据格式 JSON 进⾏通讯,参考demo如下:

  1. 通过TurboModuleRegistry的getEnforcing⽅法在js侧定义TurboModule。注意,代码中必须要输出TurboModuleRegistrySpec对象。
// SampleProject\MainProject\src\bundles\basic\SampleTurboModule.tsx
import { TurboModule, TurboModuleRegistry } from "react-native";
// ⾃定义的TurboModules
export interface SpecSampleTurboModule extends TurboModule {
  pushStringToHarmony(arg: string ,id?: number): string;
  registerFunction(onComplete: (value: string) => void): void;
  doAsyncJob(shouldResolve: boolean): Promise<string>;
  rnLog(info: string): void;
}

export default TurboModuleRegistry.getEnforcing<SpecSampleTurboModule>
('SampleTurboModule');

2. 使⽤ Codegen 或⾃⾏实现CPP层的胶⽔代码。
generated
├── RNOHGeneratedPackage.h
├── SpecSampleTurboModule.cpp
└── SpecSampleTurboModule.h

3. 在React的代码中引入SampleTurboModule,并调⽤SampleTurboModule暴露的⽅法,如registerFunction⽅法。
import SampleTurboModule from '../basic/SampleTurboModule';
···
SampleTurboModule.registerFunction((value) => {
  // 代码的实现逻辑
});

4. 实现SampleTurboModule的原⽣侧代码。
import { TurboModule } from '@rnoh/react-native-openharmony/ts';
export interface TurboModuleEventData {
  param: string
}
export class SampleTurboModule extends TurboModule {
  registerFunction(onComplete: (value: string) => void): void {
    console.log(`RNOH SampleTurboModule::registerFunction + trigger`);
    setTimeout(() => {
      onComplete?.('... from native side');
    }, 1000);
  }
  ···
  // 其余⽅法的实现
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

native给js发消息

DeviceEventEmitternative给js侧发消息,可以通过DeviceEventEmitter发送事件到js侧来实现的。包括两个部分,分别是native侧发送事件,以及js侧监听事件。本节介绍Native给js发消息的流程。

  1. native侧发送事件 开发者可以通过调⽤RNInstance中的emitDeviceEvent,向js侧发送⾃定义的事件。第⼀个参数是事件的名称,第⼆个参数是事件发送的数据。
// SampleApp\entry\src\main\ets\customView\MarqueeView.ets
this.ctx.rnInstance.emitDeviceEvent("clickMarqueeEvent", { params: { age: 18 } })

2、 js侧监听事件 开发者需要在js代码中添加对应事件的监听与处理。
DeviceEventEmitter.addListener('clickMarqueeEvent', e => {
  // 添加事件处理
});

//callRNFunction
//除了DeviceEventEmitter之外,还可以使⽤callRNFunction完成。
this.ctx.rnInstance.callRNFunction(moduleName: string, functionName: string, args:
unknown[]): void;

//该⽅法包括了三个参数,分别是
//moduleName:调⽤的模块名
//functionName:调⽤的模块的⽅法名
//args:需要传的参数
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
分享
微博
QQ
微信
回复
2024-12-11 17:36:49
相关问题
RN项目HarmonyOS化打包流程
725浏览 • 1回复 待解决
HarmonyOS 启动rn项目时报错
1037浏览 • 1回复 待解决
HarmonyOS RN项目启动不起来
842浏览 • 1回复 待解决
RTOS在什么项目用到呀?
7614浏览 • 3回复 待解决
HarmonyOS RN空工程项目报错
1055浏览 • 1回复 待解决
HarmonyOS window重名方法调用
627浏览 • 1回复 待解决
HarmonyOS 如何获取当前方法调用
603浏览 • 1回复 待解决
HarmonyOS RN项目下http请求头header问题
838浏览 • 1回复 待解决
HarmonyOS调用子组件方法
1060浏览 • 1回复 待解决
HarmonyOS js调用webview中方法
1286浏览 • 1回复 待解决
HarmonyOS NAPI调用ArkTS静态方法
1429浏览 • 1回复 待解决
IDE升级 RN项目起不来
1705浏览 • 1回复 待解决