媒介:本文主要讲直接在项目中自定义TurboModule,通过TurboModule调用鸿蒙api。前提是已经运行成功RN鸿蒙化工程
1.声明 JavaScript 接口
新架构要求必须利用强类型风格语言声明 JavaScript 接口(Flow 和 TypeScript 皆可)。Codegen 会根据这些接口声明来生成强类型的语言,其中包罗 C++、Objective-C 和 Java。
对于声明类型的代码文件必须满意以下两点要求:
- 文件必须利用 Native<MODULE_NAME>命名,在利用 Flow 时,以 .js 或 .jsx 为后缀名;在利用 Typescript 时,以 .ts 或 .tsx 为后缀名。Codegen 只会找到匹配这些命名规则的文件;
- 代码中必须要输出 TurboModuleRegistrySpec 对象
NativeCalculator.ts
- import type { TurboModule } from "react-native/Libraries/TurboModule/RCTExport";
- import { TurboModuleRegistry } from "react-native";
- export interface Spec extends TurboModule {
- add(a: number, b: number): Promise<number>;
- }
- export default TurboModuleRegistry.get<Spec>("RTNCalculator") as Spec | null;
复制代码
2. Codegen 设置
接下来,必要为 Codegen 和自动链接添加一些设置。Codegen 的作用是生成 C++ 脚手架代码,负责串联 JS 和原生侧。
有一些设置文件在 Android/iOS/HarmonyOS 平台是通用的,而有的仅能在某一平台利用。
2.1 设置 package.json 文件,在工程的package.json中添加如下:
- "harmony": {
- "codegenConfig": {
- "specPaths": [
- "./src/turboModule"
- ]
- }
- }
复制代码 2.2 设置 package.json 文件,在工程的package.json中添加如下:
- "scripts": {
- ...
- "codegen": "react-native codegen-harmony --cpp-output-path ./MyApplication/entry/src/main/cpp/generated --rnoh-module-path ./MyApplication/entry/oh_modules/@rnoh/react-native-openharmony"
- }
复制代码 实行 npm run codegen,日志中有如下产物分析实行成功(MyApplication\entry\src\main\cpp\generated\RTNCalculator.h
MyApplication\entry\src\main\cpp\generated\RTNCalculator.cpp
MyApplication/entry/oh_modules/@rnoh/react-native-openharmony/generated/turboModules/RTNCalculator.ts
)
- • MyApplication\entry\src\main\cpp\generated\RTNCalculator.cpp
- • MyApplication\entry\src\main\cpp\generated\RTNCalculator.h
复制代码
3. 原生代码
HarmonyOS 平台上 Turbo Native Module 的原生代码需实行如下步调:
- 创建用于实现模块的 CalculatorModule.ts
- 创建 CalculatorPackage.ts
创建MyApplication/entry/src/main/ets/CalculatorModule.ts
- import { TurboModule } from '@rnoh/react-native-openharmony/ts';
- import { TM } from "@rnoh/react-native-openharmony/generated/ts"
- export class CalculatorModule extends TurboModule implements TM.RTNCalculator.Spec {
- add(a: number, b: number): Promise<number> {
- return new Promise((resolve) => resolve(a + b));
- }
- }
复制代码 这个类实现了模块的功能,它继续了 TurboModule 类,对应 Android 里的 NativeCalculatorSpec。
创建用于实现模块的 MyApplication/entry/src/main/ets/CalculatorModule.ts
- import {
- RNPackage,
- TurboModulesFactory,
- } from "@rnoh/react-native-openharmony/ts";
- import type {
- TurboModule,
- TurboModuleContext,
- } from "@rnoh/react-native-openharmony/ts";
- import { TM } from "@rnoh/react-native-openharmony/generated/ts";
- import { CalculatorModule } from './CalculatorModule';
- class CalculatorModulesFactory extends TurboModulesFactory {
- createTurboModule(name: string): TurboModule | null {
- if (name === TM.RTNCalculator.NAME) {
- return new CalculatorModule(this.ctx);
- }
- return null;
- }
- hasTurboModule(name: string): boolean {
- return name === TM.RTNCalculator.NAME;
- }
- }
- export class CalculatorPackage extends RNPackage {
- createTurboModulesFactory(ctx: TurboModuleContext): TurboModulesFactory {
- return new CalculatorModulesFactory(ctx);
- }
- }
复制代码 4.将 Turbo Native Module 添加到 App,引入 Calculator TurboModule
打开 MyApp/harmony/entry/src/main/ets/RNPackageFactory.ts,添加:
- import type {RNPackageContext, RNPackage} from '@rnoh/react-native-openharmony/ts';
- + import {CalculatorPackage} from './CalculatorPackage'
- export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
- return [
- + new CalculatorPackage(ctx),
- ];
- }
复制代码 编译、运行即可。
5.JavaScript侧利用
以下是一个在 App.js 中调用 add 方法的例子:
App.js
- /**
- * Sample React Native App
- * https://github.com/facebook/react-native
- *
- * @format
- * @flow strict-local
- */
- import React from "react";
- import { useState } from "react";
- import type { Node } from "react";
- import { SafeAreaView, StatusBar, Text, Button } from "react-native";
- import RTNCalculator from "rtn-calculator/src/NativeCalculator.js";
- const App: () => Node = () => {
- const [result, setResult] = useState<number | null>(null);
- return (
- <SafeAreaView>
- <StatusBar barStyle={"dark-content"} />
- <Text style={{ marginLeft: 20, marginTop: 20 }}>
- 3+7={result ?? "??"}
- </Text>
- <Button
- title="Compute"
- onPress={async () => {
- const value = await RTNCalculator.add(3, 7);
- setResult(value);
- }}
- />
- </SafeAreaView>
- );
- };
- export default App;
复制代码 如今,您可以运行 App 并查看在屏幕上显示的组件。
尾声:TurboModule自定义 ,它将TurboModule作为三方库来写的,方便打包为tgz,鸿蒙侧可以打包为har包。本文简化了构造结构,方便在项目中直接添加。
ohos_react_native: React Native鸿蒙化堆栈
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |