本文记录把 react-native-popup-dialog(弹窗对话框 + 动画)适配到 HarmonyOS 的完整过程。

它做的事:用 Overlay + Animated 弹出一个可动画的对话框(不依赖 <Modal>),
并自带三种动画(FadeAnimation / ScaleAnimation / SlideAnimation),对话框内容由 Dialog / DialogTitle / DialogContent / DialogFooter / DialogButton 组合。

结论分两层,必须分开说:

  • 库的"零件"层面:几乎全部通过。 Positions 精确值三条全中、Animation 基类的 6 条行为全 PASS
    (含 useNativeDriver 默认 true、in()/out() 故意抛 not implemented yet)、
    10 个可运行实体全部可用、3 个动画类的继承断言全中、方法归属的原型/箭头对照也命中。
  • 但"整体弹出"没成功。 把 <PopupDialog visible> 挂上去之后,渲染时报 undefined is not a function,
    对话框文本在布局里一次都没出现(P1 相位命中 0/3)。这一层本轮未解决。

本文还记下一个重要的预检事实:createClass 命中 7 处,但 React.createClass( 精确命中是 0 —— 全是 babel 的 _createClass helper。

★★★★★ 一、createClass 的 7 处命中全是误报

预检时 createClass 命中 7 处(Animation.js / FadeAnimation.js / ScaleAnimation.js / SlideAnimation.js / Dialog.js / Overlay.js / PopupDialog.js 各一处,全在第 1 行)。
按经验 createClass 是 React 15.5 就废弃的 API ⇒ 真用了就会崩。但逐条看上下文:

[helper 定义(误报)] Animation.js L1
    Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){...
[helper 定义(误报)] FadeAnimation.js L1
[helper 定义(误报)] PopupDialog.js L1
…(7 处全是 `var _createClass = function(){…}`)

再精确扫一次:

React.createClass( 命中 = 0

⇒ ⇒ 全部是 babel 把 ES class 编译成 ES5 时注入的 _createClass helper(用来定义 class 方法),
和 React.createClass 完全无关 ✓✓

⇒ 教训(再次印证):

扫"已移除 API"必须扫真实使用形态。
createClass 要写成 React\.createClass\s*\( 才算命中;
裸词 createClass 会把 babel 的 _createClass helper 全部算进来 —— 7 处假警报。

本轮用的是"带上下文判定"的写法(区分 React.createClass / _createClass = function / _createClass(),
所以没被误导 ✓

★★★★★ 二、Positions 精确值:三条全中

源码(src/constants/Constants.js,98 字节):

export const Positions = {
  left: 'flex-start',
  right: 'flex-end',
  center: 'center',
};

实测:

NOTE | Positions = {"left":"flex-start","right":"flex-end","center":"center"}
PASS | ★★★ Positions.left = flex-start
PASS | ★★★ Positions.right = flex-end
PASS | ★★★ Positions.center = center
PASS | ★★ Positions 的键 | 期望=[center,left,right] | 实际=[center,left,right]

⇒ ⇒ 三条值与三条键全部对上 ✓
⇒ 这是本轮最干净的一组精确判据。

★★★★★ 三、Animation 基类:6 条行为全部通过(含"故意抛错")

源码(src/animations/Animation.js):

export default class Animation {
  useNativeDriver: boolean
  animate: Animated.Value

  constructor({initialValue = 0, useNativeDriver = true}: AnimationConfig = {}) {
    this.animate = new Animated.Value(initialValue);
    this.useNativeDriver = useNativeDriver;
  }

  in(onFinished?: Function): void  { throw Error('not implemented yet'); }
  out(onFinished?: Function): void { throw Error('not implemented yet'); }
}

实测:

NOTE | new Animation() 的 useNativeDriver = true
PASS | ★★★ new Animation() 默认 useNativeDriver = true          ← 默认值精确命中
NOTE | animate 是否有 setValue 方法 = function
PASS | ★★ animate 是 Animated.Value(有 setValue)
NOTE | new Animation({useNativeDriver:false, initialValue:5}) 的 useNativeDriver = false
PASS | ★★★ 传 useNativeDriver:false 生效
NOTE | in() 抛出的信息 = not implemented yet
PASS | ★★★ in() 抛 not implemented yet                          ← 故意抛错命中
NOTE | out() 抛出的信息 = not implemented yet
PASS | ★★★ out() 抛 not implemented yet

⇒ ⇒ 6 条全 PASS ✓✓

其中三条判据的类型各不相同,正好互补:

判据类型例子抓什么
默认值useNativeDriver === true构造函数的默认参数有没有生效
传参覆盖{useNativeDriver: false} ⇒ false参数是否真的被采用
对象能力animate 有 setValue是不是真的 Animated.Value 实例
故意抛错in() / out() 抛 not implemented yet抽象基类的方法有没有被实现

⇒ 第四条特别有价值:Animation 是抽象基类,in/out 故意抛错;
子类(Fade/Scale/Slide)才是真正实现的。所以这条判据同时在验证"基类没被动过"。

★★★★★ 四、方法归属:一个完美的原型 / 箭头对照

src/PopupDialog.js 里两种写法同时存在:

// ① 原型方法(会被 React 实例的原型链继承)
createDialog() { … }
updateDialog() { … }
destroyDialog() { … }
renderDialog() { … }
render() { … }

// ② 箭头类字段(只挂在实例上)
handleDismiss = () => { … }

实测:

NOTE | prototype 上缺失的方法 = (无)
PASS | ★★★ 5 个方法在 prototype 上 | 期望=0 | 实际=0
NOTE | handleDismiss 在 prototype 上吗(应为 undefined) = undefined
PASS | ★★★ handleDismiss 不在 prototype 上(它是箭头类字段)

⇒ ⇒ 同一个类里,两种成员归属被一次性验证 ✓✓
⇒ 这就是我这几轮积累的成员归属三档规则的现场演示:

写法prototype实例判据写法
普通方法 x() {}✅ 有✅(原型链)typeof C.prototype.x === 'function'
constructor 里 bind✅ 有✅(own key)两边都为 function
箭头类字段 x = () => {}❌ 没有✅(own key)typeof C.prototype.x === 'undefined'

★★★★ 五、10 个可运行实体 + 7 个 flow 类型(清单比对)

src/index.js 的具名导出是 19 项,但它们是两类东西:

export {
  Dialog, Overlay, DialogButton, DialogContent, DialogTitle, DialogFooter,   // 6 个 UI
  Animation, FadeAnimation, ScaleAnimation, SlideAnimation,                  // 4 个动画类
  DialogProps, DialogFooterProps, DialogFooterActionList,                    // 7 个 flow 类型
  DialogButtonProps, DialogTitleProps, DialogContentProps, OverlayProps,
};
export default PopupDialog;

实测(用清单比对,而不是数数字):

NOTE | 10 个可运行实体里非 undefined 的个数 = 10
PASS | ★★★ 10 个可运行实体全部非 undefined
       期望=[Animation,Dialog,DialogButton,DialogContent,DialogFooter,DialogTitle,
             FadeAnimation,Overlay,ScaleAnimation,SlideAnimation]
       实际=[…完全相同…]

NOTE | 7 个 flow 类型导出里 undefined 的 =
       DialogProps, DialogFooterProps, DialogFooterActionList, DialogButtonProps,
       DialogTitleProps, DialogContentProps, OverlayProps          ← 全部 7 个都是 undefined

⇒ ⇒ 可运行的 10 个全在;7 个 flow 类型在运行时全部 undefined ✓(这是正常的 —— flow 类型只存在于编译期)✓

这也是"清单比对"这条方法的价值(这几轮我一直想在数量断言上做对):
如果我只断言"具名导出有 19 项",会误以为那 7 个类型也能用;
分开成"可运行清单"与"类型清单"比对,才看清真相 ✓

★★★★ 六、继承断言:3 个动画类都 extends Animation

PASS | ★★★ FadeAnimation.prototype instanceof Animation
PASS | ★★★ ScaleAnimation.prototype instanceof Animation
PASS | ★★★ SlideAnimation.prototype instanceof Animation

⇒ X.prototype instanceof Base 是断言继承最干净的写法 ✓

★★★ 七、一个我必须纠正的假设:4 个组件是函数组件,不是 class

我一开始断言"6 个 UI 组件都是 class(有 prototype.render)":

NOTE | 不是 class 的组件 = DialogButton, DialogContent, DialogTitle, DialogFooter
FAIL | ★★★ 6 个 UI 组件都是 class(有 prototype.render) | 期望=0 | 实际=4

回源码看:

// src/components/DialogButton.js  L34
function DialogButton({ … }) { … }
// src/components/DialogTitle.js   L32
function DialogTitle({ … }) { … }
// src/components/DialogFooter.js  L21
function DialogActionList({ … }) { … }
// src/components/DialogContent.js L15
function DialogContent({ style, children }) { … }
// src/components/Dialog.js   →  class(有 DIALOG_OPENING / DIALOG_OPENED 常量)
// src/components/Overlay.js  L7  →  class Overlay extends Component

⇒ ⇒ 4 个函数组件 + 2 个 class ✓
⇒ 教训:一个库里"组件都是 class"这种假设不能凭包龄做(这是 0.18.x 的老包,但内部已经混用了函数组件)。
⇒ 正确做法:断言前先看每个文件的 export default 那一行是 class 还是 function ✓

顺带一个可用的细节:DialogButton / DialogTitle 里有 const isAndroid = Platform.OS === 'android' ⇒ 鸿蒙上取 false ✓ 不影响功能。

★★★ 八、没成功的那一层:<PopupDialog visible> 渲染时报错

把 <PopupDialog visible onDismissed width height> 挂上去、用时间轴切 visible:

P1(visible=true)对话框文本命中 0 / 3
P2(visible=false)残留 0
LogBox: "undefined is not a function"

⇒ ⇒ 对话框一次都没渲染出来 ✗
⇒ 而且 LogBox 报了 undefined is not a function —— 说明内部某处调用了不存在的方法。

最可能的位置(未证实):

  • PopupDialog.js L4 import Sibling from 'react-native-root-siblings' ⇒ react-native-root-siblings@3.x 的 API 与当前环境是否匹配;
  • Overlay.js 里的 componentWillReceiveProps(React 19 已移除 ⇒ 该方法不会被调用,但不应该导致 undefined is not a function);
  • Animated 的某个方法在 RNOH 上的差异。

⚠️ 我没有定位到根因,所以本文不把它写成"库有 bug" ——
只写"在这个基线上,<PopupDialog> 的渲染路径会抛 undefined is not a function,对话框未能显示,根因未查明"。

⇒ 但"零件层面"的 25 条判据全部有效:Positions、Animation 基类、继承、方法归属、导出清单都不依赖那条渲染路径 ✓

★★ 九、其余预检结论

预检项结果
老写法九项⚠️ createClass 7 处全是 _createClass helper(误报);componentWillReceiveProps 1 处(Overlay.js,React 19 下不执行);其余空
ListView / ViewPropTypes / Text.propTypes / measure / onLayout / NativeModules✅ 全空
<Modal> / FlatList✅ 空 ⇒ 不用 Modal,用 Overlay + Animated
Platform.OS 4 处isAndroid = Platform.OS === 'android' ⇒ 鸿蒙取 false ✓
useNativeDriver 29 处⚠️ 多,但 Animation 基类默认 true(实测)
dependencies⚠️ react-native-root-siblings(必须显式装);prop-types(已有);babel-plugin-flow-react-proptypes(babel 插件,不用装)
peerDependencies✅ 只有 react-native >= 0.50
scripts.prepare✅ 空
交付包src/(14 文件)+ dist/(编译产物)+ .github/*.gif(演示动画,约 4 MB)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


十、接入与预检(要点)

npm install "git+https://atomgit.com/oh-react-native/react-native-popup-dialog.git#0.18.3-ohos-1.0.0" --ignore-scripts
# ★ 必须显式装它的运行时依赖(file: 接入不会自动装)
npm install --ignore-scripts react-native-root-siblings@^3.2.1
# babel-plugin-flow-react-proptypes 是 babel 插件,不需要装

十一、交付包质量与基线说明

类别结果
交付包内容src/(14 个 js)+ dist/(编译产物,index.js 含具名导出 ✓)+ .github/*.gif(约 4 MB 演示)
spec.json⚠️ 缺 upstreamCommit
validation⚠️ "build-pass-device-pending"
⚠️ 声明的基线reactNative: "0.88.0" + rnoh: "0.84.4" ⇒ 两字段自相矛盾
备注库代码零改动

关于基线:本次验证在 RN 0.84.1 + RNOH 0.84.3 上完成。
⚠️ <PopupDialog> 整体弹出这条路径在本基线上未走通(见第八节)⇒ 渲染路径的结论只对本基线成立;
零件层面(Positions / Animation / 继承 / 方法归属 / 导出清单)的 25 条判据跨基线成立 ✓


十二、已知限制与本次验证边界

12.1 用这个库要知道的

事项说明
★★★★★ createClass 命中是误报7 处全是 babel 的 _createClass helper;React.createClass( 精确命中 0
★★★★★ Positions = {left:'flex-start', right:'flex-end', center:'center'}三个值可直接用
★★★★★ Animation 是抽象基类useNativeDriver 默认 true;in() / out() 故意抛 not implemented yet ⇒ 要用子类
★★★★ FadeAnimation / ScaleAnimation / SlideAnimation 都 extends Animation继承关系实测成立
★★★★ PopupDialog 的方法归属混合原型方法:createDialog / updateDialog / destroyDialog / renderDialog / render;箭头类字段:handleDismiss
★★★★ 4 个组件是函数组件DialogButton / DialogTitle / DialogFooter(DialogActionList)/ DialogContent;只有 Dialog / Overlay 是 class
★★★ 7 个 flow 类型导出运行时全部 undefinedDialogProps / DialogFooterProps / DialogFooterActionList / DialogButtonProps / DialogTitleProps / DialogContentProps / OverlayProps
⚠️ <PopupDialog visible> 在本基线上渲染报 undefined is not a function对话框未能显示,根因未查明
★★ 必须装 react-native-root-siblingsPopupDialog.js 直接 import 它
★ babel-plugin-flow-react-proptypes 不用装它是 babel 插件,不是运行时依赖
★ Overlay.js 有 componentWillReceivePropsReact 19 下该方法不会被调用 ⇒ 那条更新逻辑失效

12.2 本次验证的边界

  1. ★★★ <PopupDialog> 整体弹出未走通(渲染报 undefined is not a function,对话框文本一次未出现);
  2. ★★★ 未验证 FadeAnimation / ScaleAnimation / SlideAnimation 的实际动画效果(只验证了继承关系);
  3. ★★★ 未验证 Dialog / DialogTitle / DialogContent / DialogFooter / DialogButton 的组合渲染;
  4. ★★ 未验证 onDismissed 回调;
  5. ★★ 未验证 width / height / position(Positions)的实际布局效果;
  6. 未验证 Dialog 的 BackHandler 返回键逻辑;
  7. 未验证 react-native-root-siblings 的兄弟节点挂载在 RNOH 上的行为;
  8. 未在 RN 0.88.0 / RNOH 0.84.4 上复验;
  9. 未测其它屏幕宽度;未做跨平台对照。

库代码未改动。


十三、常见问题

Q1:它在 RN 0.84 上能跑吗?

分两层:

  • 零件层面:能。 Positions 三条精确值全中、Animation 基类 6 条行为全 PASS、3 个动画类继承成立、
    10 个可运行实体全部可用、方法归属对照命中。
  • 整体弹出:本基线未走通。 <PopupDialog visible> 渲染时报 undefined is not a function,对话框文本一次都没出现。

Q2:createClass 命中 7 处,是不是不兼容?

不是。 React.createClass( 的精确命中是 0;那 7 处全是 var _createClass = function(){…}(babel 编译 class 用的 helper)。
扫描时要写成 React\.createClass\s*\( 才算命中,裸词会全被 helper 骗到。

Q3:new Animation() 为什么一调用 in() 就抛错?

因为 Animation 是抽象基类:

in(onFinished)  { throw Error('not implemented yet'); }
out(onFinished) { throw Error('not implemented yet'); }

要用子类:FadeAnimation / ScaleAnimation / SlideAnimation(都 extends Animation)。

Q4:DialogButton / DialogTitle 用 typeof === 'function' 判断得了吗?

能,但它们没有 prototype.render —— 它们是函数组件(function DialogButton({…})),
不是 class。所以:

typeof DialogButton === 'function';              // true
typeof DialogButton.prototype.render;           // undefined  ← 别指望有

只有 Dialog 和 Overlay 是 class。

Q5:7 个 *Props 导出是 undefined,正常吗?

正常 —— 它们是 flow 类型(DialogProps / DialogFooterProps / …),只存在于编译期。
运行时用不到它们;如果你在 JS 里 import {DialogProps} 会拿到 undefined。

Q6:必须装什么?

npm install --ignore-scripts react-native-root-siblings@^3.2.1

(PopupDialog.js 直接 import 它。babel-plugin-flow-react-proptypes 是 babel 插件,不用装。)

Q7:Positions 从哪导?

它不在 src/index.js 的具名导出清单里,要从子路径拿:

import {Positions} from 'react-native-popup-dialog/dist/constants/Constants';
// {left:'flex-start', right:'flex-end', center:'center'}

小结

react-native-popup-dialog 是用 Overlay + Animated 实现的弹窗对话框(不依赖 <Modal>),
自带 Fade / Scale / Slide 三种动画。

这一轮的结论必须分两层说,因为两层的结果不一样:

零件层面(25 条判据全 PASS)

  1. Positions 三条精确值全中:
    {left:'flex-start', right:'flex-end', center:'center'} ✓
  2. Animation 基类 6 条行为全 PASS,其中两条最有价值:
    • 默认值:new Animation() 的 useNativeDriver 默认 true ✓
    • 故意抛错:in() / out() 抛 not implemented yet ✓(证明抽象基类没被动过)
  3. 继承断言全中:Fade/Scale/Slide.prototype instanceof Animation ✓
  4. 方法归属的"原型 / 箭头"对照在一个类里被一次性验证:
    createDialog/updateDialog/destroyDialog/renderDialog/render 在 prototype 上;
    handleDismiss(箭头类字段)不在 prototype 上 ✓
  5. 10 个可运行实体全部非 undefined(清单比对)✓;7 个 flow 类型运行时全 undefined(正常)✓

整体弹出层面(未走通)
6. <PopupDialog visible> 渲染时报 undefined is not a function,对话框文本一次未出现。
根因未查明 ⇒ 本文只写"本基线未走通",不写成"库有 bug" ✓

方法论收获
7. createClass 的 7 处命中全是 babel 的 _createClass helper —— React.createClass( 精确命中 0。
⇒ 再一次印证:扫"已移除 API"必须扫真实使用形态(这条规则已经救过好几次)。
8. "清单比对"替代"数量断言"确实更稳:本轮把 19 个具名导出拆成"10 个可运行 + 7 个类型"两张清单,
数量对不上、名字对不上都会被抓住,而且顺手发现了 flow 类型在运行时是 undefined 这个事实 ✓
9. 我这次又栽在一个"假设"上:断言"6 个 UI 组件都是 class" ⇒ 实际 4 个是函数组件。
⇒ 一个包里可以混用 class 与函数组件,必须逐个看 export default 那一行。


本篇用到的库

项内容
三方库react-native-popup-dialog(上游 0.18.3 的鸿蒙适配版)
适配仓库https://atomgit.com/oh-react-native/react-native-popup-dialog
适配 TAG0.18.3-ohos-1.0.0
需要 HAR / 权限 / ohpm都不需要(纯 JS)
库类型弹窗对话框 + 三种动画(Overlay + Animated,不用 Modal)
运行时依赖⚠️ react-native-root-siblings 必须显式装;prop-types(已有)
不需要装babel-plugin-flow-react-proptypes(babel 插件)
导出形态默认导出 PopupDialog(class);具名 19 项(10 个可运行 + 7 个 flow 类型)
⚠️ 本基线问题<PopupDialog visible> 渲染报 undefined is not a function,对话框未能显示
许可证MIT
上游仓库https://github.com/jacklam718/react-native-popup-dialog
宿主工程RNOH084Demo(测试页 rnAppKey = PopupDialogTestApp)
npm install "git+https://atomgit.com/oh-react-native/react-native-popup-dialog.git#0.18.3-ohos-1.0.0" --ignore-scripts
npm install --ignore-scripts react-native-root-siblings@^3.2.1
import PopupDialog, {
  Dialog, Overlay, DialogButton, DialogContent, DialogTitle, DialogFooter,
  Animation, FadeAnimation, ScaleAnimation, SlideAnimation,
} from 'react-native-popup-dialog';

// Positions 不在入口具名清单里,要从子路径拿
import {Positions} from 'react-native-popup-dialog/dist/constants/Constants';
// Positions = {left:'flex-start', right:'flex-end', center:'center'}

<PopupDialog visible={visible} onDismissed={() => {}} width={0.85} height={0.3}>
  <View>
    <DialogTitle title="标题" />
    <DialogContent><Text>内容</Text></DialogContent>
    <DialogFooter>
      <DialogButton text="确定" onPress={() => {}} />
    </DialogFooter>
  </View>
</PopupDialog>

// ★ Animation 是抽象基类:in()/out() 故意抛 'not implemented yet'
//   用子类:new FadeAnimation() / new ScaleAnimation() / new SlideAnimation()
//   useNativeDriver 默认 true
const anim = new Animation();
anim.useNativeDriver;     // true(默认值)
anim.in();                // ✗ 抛 Error('not implemented yet')

// ⚠️ 本基线上 <PopupDialog visible> 渲染会报 undefined is not a function(未查明)
// ⚠️ 7 个 flow 类型导出(DialogProps 等)运行时是 undefined —— 正常
// ⚠️ 4 个组件是函数组件(DialogButton/DialogTitle/DialogFooter/DialogContent),无 prototype.render
// ⚠️ createClass 的 7 处命中全是 babel 的 _createClass helper(React.createClass 命中 0)
// ⚠️ Overlay.js 有 componentWillReceiveProps(React 19 下不执行)
# 换页启动测试页 —— force-stop 不能省
hdc shell aa force-stop com.rnoh084.demo
hdc shell aa start -b com.rnoh084.demo -a EntryAbility --ps rnAppKey PopupDialogTestApp

判据的复现方式

# ① 零件层面 25 条判据
hdc shell "hilog -x | grep ppd-test" | Select-String 'PASS|FAIL|SUMMARY|NOTE'
#    ⇒ Positions 三值全中;Animation 默认 useNativeDriver=true;in()/out() 抛 not implemented yet
#    ⇒ 10 个可运行实体全非 undefined;7 个 flow 类型全 undefined
#    ⇒ handleDismiss 不在 prototype 上
# ② 整体弹出(本基线未走通)
devecocli ui layout | Select-String 'PPD 对话框标题'   # ⇒ 命中 0

验证环境

项版本
React Native0.84.1
React19.2.3
RNOH(npm / ohpm)@react-native-oh/react-native-harmony / @rnoh/react-native-openharmony 0.84.3
Node.js / npmv24.14.0 / 11.9.0
DevEco Studio26.0.0.621
HarmonyOS SDKAPI 26(26.0.0.32)
设备HarmonyOS 7.0.0(26.0.0) Beta2 模拟器 Pura X View(ohos-x64),1320×2232,density 3
本机状态栏高度117px = 39vp
宿主依赖⚠️ 补装 react-native-root-siblings
宿主 HAP 产物entry-default-signed.hap
本次构建assembleHap 3 分 37 秒 ⇒ 一次成功(打包与构建退出码都检查了)
验证规模25 PASS / 1 FAIL(FAIL 是我假设"6 个组件都是 class",实际 4 个是函数组件);Positions 三值全中;Animation 6 条行为全 PASS;继承 3/3;清单比对命中;<PopupDialog> 整体弹出未走通(undefined is not a function);4 张截图互异

⚠️ 基线说明:交付包 spec.json 声明 RN 0.88.0 + RNOH 0.84.4(两字段自相矛盾),本次验证在 RN 0.84.1 + RNOH 0.84.3 上完成。
零件层面判据跨基线成立;整体渲染路径的结论只对本基线成立(未走通)。


相关社区与项目地址

项目地址
React Native 鸿蒙官方社区(CPF-RN)https://atomgit.com/CPF-RN
RNOH 框架仓库https://atomgit.com/openharmony-RN/ohos_react_native
RNOH 三方库使用文档https://atomgit.com/OpenHarmony-RN/usage-docs
React Native for OpenHarmony 组织https://atomgit.com/oh-react-native
RN 三方库鸿蒙适配清单https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview

欢迎加入 CPF-RN 鸿蒙社区:https://atomgit.com/CPF-RN

React Native for OpenHarmony 组织:https://atomgit.com/oh-react-native

RN 三方库鸿蒙适配清单:https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐