news 2026/9/9 10:34:54

OpenHarmony跨端开发实测:RNOH TodoList渐变背景踩坑全记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenHarmony跨端开发实测:RNOH TodoList渐变背景踩坑全记录

很多人一开始接触 OpenHarmony 应用开发时,第一个纠结的问题不是用什么架构,而是“我到底该用 ArkTS 写原生,还是用跨端框架”。我的看法很简单:如果你的团队已经有 React 技术栈沉淀,或者你后续要在多个系统上一套代码复用,React Native for OpenHarmony(下面简称 RNOH)绝对值得认真试一试。但跨端框架移植这种事,不是看官方 Demo 跑得多欢就能下结论的。我用一个最常见的 TodoList 项目做了一场实测,结果发现光是“渐变背景色”这么一个小需求,就把渲染兼容性、原生组件桥接、调试链路这些底裤全扒了出来。

这篇文章就把整个实战过程完完整整写一版:怎么选设备、怎么搭环境、TodoList 的核心功能怎么拆、渐变背景在 RNOH 上到底有几种实现方式、以及我在 RK3568 真机上一路踩过去的坑。无论你是刚接触 OpenHarmony 的 RN 开发者,还是在 ArkUI 和跨端方案之间犹豫的选型党,这篇应该都能给你一些参考。

1. 为什么选 RN 开发 OpenHarmony 应用:TodoList 是最合适的试金石

1.1 跨端框架在 OpenHarmony 生态的现状

OpenHarmony 应用开发目前的主流路线其实就三条:第一条是 ArkTS + ArkUI 纯原生开发,性能和系统能力调用最直接,但生态和开发者存量比起主流移动端还是小;第二条是各种跨端方案,Flutter、RN、uni-app 都在往 OpenHarmony 上移植;第三条是 Web 容器,用 WebView 套 H5,最省事但体验天花板太低。

RNOH 并不是一个民间野项目,而是 OpenHarmony 社区主导的 React Native 移植版本。它的思路是把 RN 的 JavaScript 运行时、Fiber 渲染调度器、原生模块桥接层,逐一映射到 OpenHarmony 的 ArkUI 能力上。也就是说,你在 RN 里写<View><Text><FlatList>,最终在 OpenHarmony 设备上渲染出来的是 ArkUI 的对应组件。对于熟悉 React 生态的团队来说,这意味着可以拿现有的组件库、状态管理方案、工程化工具链直接迁过来,这是它最大的吸引力。

但移植这种事,最怕的就是“看起来能用”。RN 官方支持 Android 和 iOS,RNOH 要在一个全新的系统上重新实现组件映射和原生模块兼容,必然有一些边角是残缺的。而判断残缺到什么程度,不能只看官方仓库的冒烟测试,必须跑一个真实的、带交互的、有列表有状态的小项目。

1.2 TodoList 覆盖的能力面恰好是生产项目的缩影

TodoList 看起来是“玩具项目”,但它其实把生产应用最常见的技术点全踩了一遍:

  • 根布局与样式系统:Flexbox 布局、间距、圆角、背景色是否正常工作;
  • 文本输入与键盘交互:TextInput 的焦点、弹出、占位符在目标平台上是否卡顿;
  • 列表渲染与滚动:FlatList 的数据绑定、复用、回收机制是否走得通;
  • 状态管理:组件内 useState、组件间回调传递是否顺手;
  • 触摸事件:Pressable / TouchableOpacity 的点击反馈是否准确;
  • 样式高级特性:也就是本文重点要聊的渐变背景色,涉及样式系统是不是只支持“纯色”这种基础能力。

任何一个环节出问题,你在生产项目里也大概率会撞上。所以把 TodoList 当成一块试金石,先跑一遍再决定要不要全面迁移,成本最低。我这次实际跑下来,基础组件和交互大部分都没问题,真正让人揪心的恰恰是“渐变背景色”这个看起来最不起眼的需求。后面我会用一整章来把这件事掰开揉碎讲清楚。

2. 环境准备与设备选型:rk3568 和 rk3588 到底怎么选

2.1 设备树选择:别被一堆 dts 文件吓住

如果你用的是 RK3568 或者 RK3588 的开发板,第一次搜“openharmony rk3568 设备树怎么选”的时候,一定会被 arch/arm64/boot/dts/rockchip/ 下面那一堆 dts 文件吓到。什么 rk3568-evb.dts、rk3568-evb1-ddr4-v10.dts、rk3568-iotest.dts,光看文件名完全分不清哪个对应你手里的板子。

这里我先给一个最省心的结论:不要自己从零选 dts,以你拿到手的那套系统镜像为准。开发板厂商提供 OpenHarmony 系统镜像时,一般已经编译好了配套的 dtb 文件,你直接烧录、直接跑就行。只有在你自己要编译内核、或者要修改内核配置的时候,才需要去 dts 目录里找到匹配你板卡型号的那个文件。识别方法也很简单:看你的板子原理图或者产品页上标注的型号,比如润和 DAYU200、正点原子 RK3568、香橙派 5 这种,然后去 dts 目录下找带同样关键词或者 EVB 后缀的文件。

如果非要自己改 dts,我的忠告是:动之前先备份,而且别一次改太多。rk3568 的 dts 里同时牵涉 HDMI、MIPI DSI、以太网、USB、SD 卡等一堆外设节点,很多人只是想把调试串口的波特率改一下,结果顺手把显示节点的 status 改坏了,导致整个板子成了一块“砖”。我自己就在 RK3568 上调过 MIPI 屏的初始化时序,深切体会过改一条属性带来的连锁反应。

2.2 RNOH 开发环境搭建与 hdc/USB 调试链路

设备层面,我最终选了 RK3568 的开发板。对比一下 RK3568 和 RK3588 的实际差异,方便你决策:

维度RK3568RK3588
CPU4×Cortex-A55,日常够用4×A76 + 4×A55,性能悬殊
GPUMali-G52Mali-G610,图形能力明显更强
常见开发板润和 DAYU200、正点原子等RK3588 EVB、香橙派 5 等
内存4GB 居多8GB/16GB 更常见
OpenHarmony 社区资料最多,踩坑方案好搜适配板子越来越多,但资料相对少
适合场景跑 RNOH Demo、学习验证、小工具承载更重的图像和交互场景

我的建议是:如果你主要是验证 RNOH 能不能跑、跑几个基础 Demo,RK3568 完全够用;如果你已经确定要在这个平台上做正式产品,直接上 RK3588,后端的余量会大很多。从 RN 开发角度看,两者差别主要在渲染性能和列表滚动流畅度上,我在 RK3568 上实测,小规模页面没什么压力。

开发环境搭建的链路如下,用命令行记录一下关键步骤:

# 安装完 DevEco Studio 并配置好 OpenHarmony SDK 后 # 使用 RNOH 官方脚手架初始化项目 npx @react-native-ohos/cli init RNTodoDemo # 进入项目,安装依赖 cd RNTodoDemo npm install # 编译 HAP 包并通过 hdc 安装到开发板 hdc list targets hdc install entry/build/default/outputs/default/entry-default-signed.hap # 查看设备端日志 hdc shell hilog | grep ReactNative

hdc 就是 OpenHarmony 版 adb,语法几乎一样。最常见的问题是hdc list targets看不到设备。这个我后面专门讲,先记住三个排查口令:hdc killhdc start、然后重新插拔 USB 线。

顺便提一下,有朋友看到网上资料里提到 “openharmony usbmanager libusb 的使用”,以为 RN 调试也跟这个有关,其实不对。OpenHarmony 的 USBManager 是给应用层调用 USB 外设能力用的接口,底层确实基于 libusb,但开发 RN 应用时调试走的是 hdc over USB,两者不是一回事。搞清楚这一点,能省掉不少瞎折腾的时间。

3. TodoList 功能骨架:数据模型、列表渲染与交互状态

3.1 数据模型与状态管理选型

TodoList 的数据模型非常简单,核心就是一个数组。我在项目里定义了一个 TypeScript 接口:

interface TodoItem { id: string; text: string; completed: boolean; createdAt: number; }

状态管理层我没上 Redux,也没上 Zustand,直接用 React 自带的useState就足够了。很多人一上来就喜欢堆状态管理库,但对于 TodoList 这种数据流完全在单页内部流转的场景,引入外部状态库只会增加概念负担。RNOH 移植的是 React 18 的并发特性,useState在这种小规模状态更新下表现非常稳。

持久化这块要说明一下:如果要实现“重启应用后待办还在”,通常在 RN 里会用@react-native-async-storage/async-storage。但这个包在 RNOH 上并非开箱即用,它依赖原生模块,需要确认对应的 OpenHarmony 实现是否已合入。为了避免在基础 Demo 阶段被第三方原生包卡住,我一开始先用内存数据,把功能链路跑通,再决定要不要接入持久化。这个顺序对新手很重要:先确保主流程没有阻塞点,再处理附加能力。

3.2 组件拆分和增删改查实现

我把界面拆成了三个组件:TodoInput(输入框 + 添加按钮)、TodoItem(单条显示 + 勾选 + 删除)、TodoList(FlatList 列表容器)。核心逻辑如下:

const [todos, setTodos] = useState<TodoItem[]>([]); const addTodo = (text: string) => { const trimmed = text.trim(); if (!trimmed) return; setTodos(prev => [ ...prev, { id: Date.now().toString(), text: trimmed, completed: false, createdAt: Date.now(), }, ]); }; const toggleTodo = (id: string) => { setTodos(prev => prev.map(todo => todo.id === id ? { ...todo, completed: !todo.completed } : todo ) ); }; const removeTodo = (id: string) => { setTodos(prev => prev.filter(todo => todo.id !== id)); };

列表渲染部分用 FlatList:

<FlatList data={todos} keyExtractor={item => item.id} renderItem={({ item }) => ( <TodoItem item={item} onToggle={toggleTodo} onRemove={removeTodo} /> )} />

这里我特意说明一下为什么不直接用ScrollView + map。FlatList 在列表项变多时做的是懒加载和回收复用,而ScrollView + map会一次性渲染全部子节点。在 OpenHarmony 这种还在持续优化的渲染层上,长列表用 FlatList 几乎是必须的。RNOH 的 FlatList 已经完成对 OpenHarmony 原生列表组件的映射,实测渲染 100 条左右的 TodoItem 没有明显压力。

3.3 列表刷新策略

RNOH 上的 FlatList 性能表现,有一半取决于参数设置。默认配置在 Android 上没问题,但搬到 RK3568 这类中端设备上,你要是真不调参,列表滚动时可能感到掉帧。我实测下来,一组比较稳的参数是这样:

<FlatList data={todos} keyExtractor={item => item.id} renderItem={renderItem} initialNumToRender={6} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={false} />

注意有一个反直觉的坑:removeClippedSubviews在 RN Android 上开启后能提升性能,但在 RNOH 上,如果你把它设为true,在部分开发板上有概率出现滚动过程中内容闪烁的问题。所以我的建议是刚开始就保持false,等确认列表项没有复杂背景、没有绝对定位元素时,再考虑是否开启。

每次点击勾选或删除,setTodos会产生新数组,FlatList 的data引用变化就会触发局部刷新。TodoItem 如果做一层React.memo,只有对应项的状态变化时才重渲染,优化效果会更明显。这个习惯建议在生产项目里也保持。

4. 渐变背景色的正确实现:LinearGradient 在 RNOH 的兼容真相

4.1 渐变背景的设计动机和参数拆解

TodoList 的功能本身很枯燥,为了让这个项目看起来不像课堂练习,我在视觉上加了点料:一个从深紫过渡到蓝青的斜向渐变背景。这个渐变不是随手拍脑袋定的,而是考虑了信息可读性后确定的方案:背景颜色必须深沉一些,这样白色文字的 TodoItem 能保持足够的对比度;渐变方向选斜向而不是从上到下,是因为对角渐变在视觉上更有层次感,又不会像水平渐变那样有明显的主次方向干扰用户浏览纵向列表。

渐变本身有三个关键参数要理解。

第一是方向。在 CSS 里你用linear-gradient(to right, ...)这种语义,但在 SVG 的 LinearGradient 里是通过x1/y1x2/y2一对坐标来定义方向的。默认坐标是百分比坐标:(0%, 0%)是左上角,(100%, 100%)是右下角。常见的方向对应关系如下:

渐变方向x1/y1x2/y2
从上到下0% / 0%0% / 100%
从左到右0% / 0%100% / 0%
斜向左下到右上0% / 100%100% / 0%
斜向左上到右下0% / 0%100% / 100%

我最终选了从左上到右下,也就是最后一行,让背景色从 #6A11CB 这类深紫过渡到 #00C9FF 这类亮蓝。

第二是色标(color stop)。一个渐变至少两个颜色,也可以加中间色。三个颜色的渐变比两个颜色更容易过渡得自然,比如深紫、宝蓝、亮青三个 Stop 组合出来,背景会更通透。

第三是透明度。在深色背景上,列表内容要有层次,可以让渐变底色略微发暗,或者在半透明的内容卡片上叠加透明度。这个后面会讲到。

4.2 方案一:react-native-linear-gradient / expo-linear-gradient 的尝试

在传统 RN 项目里做渐变,react-native-linear-gradient几乎是标配。但在 RNOH 上,第一步就分叉了。RN 的老版本原生模块用 autolinking 自动链接,但 RNOH 目前对第三方原生模块的链接支持还做不到“装完就能用”。很多包 install 之后,iOS 和 Android 都能正常编译,唯独 OpenHarmony 工程里找不到对应的原生实现。react-native-linear-gradient就是这样,默认 npm 包里面并没有 ohos 目录,你需要手动寻找社区的 fork 版本,然后在 OpenHarmony 工程的oh-package.json5里补充依赖。

这条路不是走不通,但它把你拖进了一个“版本对齐”的泥潭:RNOH 版本、线性渐变库的 fork 版本、react-native 的版本三方要对齐,任何一个不匹配,编译期就是一堆 C++ 桥接报错。我的建议是:如果只是想给 TodoList 加个背景色,没必要一开始就在这上面死磕。

expo-linear-gradient也一样。需要注意,Expo 模块体系依赖 Expo 的 autolinking 中间层,RNOH 社区虽然也在做适配,但成熟度参差不齐。你很容易遇到安装成功、编译成功、跑起来却是纯色背景的诡异情况——因为原生侧没有真正把 JS 侧传过去的渐变参数解析到 ArkUI 渲染层。

4.3 方案二:react-native-svg 的 LinearGradient(推荐)

如果你只是想实现一个斜向或垂直的线性渐变背景,我强烈推荐直接用react-native-svgLinearGradient。原因很实际:RNOH 对 SVG 的兼容层做得比较早也比较好,因为大量图表、图标组件都依赖它,社区踩坑的人多,补丁合入得也快。

用 SVG 实现全屏渐变背景,可以直接把背景层铺在整个页面最底层,核心代码如下:

import React from 'react'; import { StyleSheet, View } from 'react-native'; import Svg, { Defs, LinearGradient, Stop, Rect } from 'react-native-svg'; const GradientBackground: React.FC<{ children: React.ReactNode }> = ({ children }) => { return ( <View style={styles.root}> <Svg style={StyleSheet.absoluteFill} pointerEvents="none"> <Defs> <LinearGradient id="appBg" x1="0%" y1="0%" x2="100%" y2="100%"> <Stop offset="0%" stopColor="#6A11CB" /> <Stop offset="50%" stopColor="#2575FC" /> <Stop offset="100%" stopColor="#00C9FF" /> </LinearGradient> </Defs> <Rect width="100%" height="100%" fill="url(#appBg)" /> </Svg> <View style={styles.content}>{children}</View> </View> ); }; const styles = StyleSheet.create({ root: { flex: 1, }, content: { flex: 1, }, }); export default GradientBackground;

几个非常容易踩的细节,我逐个说明。

第一个坑:LinearGradient里的id必须全局唯一。如果项目里有多个渐变背景,不要给所有渐变都起名叫bg,否则同一个页面里会出现渐变引用串台的怪问题。

第二个坑:Rectwidthheight写成"100%"在多数 RNOH 版本上没问题,但我在某些早期版本上遇到过百分比尺寸不生效、整个背景消失的情况。稳妥做法是用Dimensions.get('window')拿到屏幕宽高,然后给Rect设成具体数字。代价是屏幕旋转时需要重新计算,但 TodoList 这种竖屏页面完全够用。

第三个坑:Svg层虽然绝对定位铺满了,但它默认会拦截触摸事件。在背景层上加上pointerEvents="none",让触摸事件穿透到列表层,否则你会发现列表滚动不流畅——触摸都被“背景玻璃”挡住了。这个问题我在第一种方案和第二种方案里都遇到过,属于只要用绝对定位做背景就一定会碰到的通用问题。

第四个坑是关于渲染层级。Svg背景一定要放在content的前面,确保在渲染顺序上背景在最底层。RN 的StyleSheet.absoluteFill用的是绝对定位,如果后续组件没有设置zIndex,同一层级下后面的元素会盖住前面的。这里contentSvg之后渲染,所以内容自然浮在背景上方,不用额外设zIndex

4.4 方案三:调用 ArkUI 原生 linearGradient 能力(进阶)

如果你的应用不止是背景渐变,还涉及图表渐变、进度环、遮罩纹理,纯 SVG 方案在性能和能力边界上会有瓶颈。这时候就可以考虑把 ArkUI 的原生linearGradient能力封装成一个 RN 自定义原生组件。RNOH 架构允许你写一个 ArkTS 组件,再通过原生模块桥接注册到 RN。

大概的链路是:

  1. 在 ArkTS 侧写一个自定义组件,内部给根容器的.linearGradient()方法赋值,设置方向、颜色数组、渐变点;
  2. 继承ComponentBase或者其他 RNOH 提供的基类,在onReceiveMessage或属性绑定处接住 JS 侧传过来的渐变配置;
  3. codegenNativeComponent在 JS 侧声明这个组件,之后就能像普通 RN 组件一样使用;
  4. 编译 HAP 时把该原生模块一起打包。

这个方案的门槛在于你得同时熟悉 ArkTS 和 RNOH 的原生桥接细节,而且出错时日志定位比较费劲。但它换来的是直接调用 ArkUI 的底层渲染能力,性能最好,还能用到 SVG 方案不容易实现的重复渐变、角度渐变和更复杂的渐变动画。

我的判断是:如果你只是做应用背景,方案二够了;如果你要把渐变用在核心 UI 元素上并且对性能有硬指标,或者已经准备长期投入 RNOH 开发,方案三值得认真掌握。

4.5 三种方案对比与通用建议

把三种方案放在一起对比一下:

方案实施成本稳定性性能适用场景
react-native-linear-gradient中,需要找兼容 fork 并处理原生链接依赖版本对齐中高项目里已经深度依赖该库
react-native-svg LinearGradient低,npm 装包后纯 JS 侧使用高,社区适配早背景渐变、简单区域渐变,默认推荐
ArkUI 自定义原生组件高,需要写 ArkTS 和桥接高且可控最高复杂渐变、性能敏感、生产级应用

我的通用建议是:第一次在 RNOH 项目里做渐变背景,直接选 react-native-svg。它把原生兼容问题主要收敛在一个成熟依赖上,出问题的概率最小。等项目的原生工程体系跑通了、团队里有熟悉 ArkTS 桥接的人,再往方案三演进不迟。最不推荐的做法是在项目初期就直接上原生自定义组件,因为你在同一个调试周期内要同时排查 JS 层样式问题和 C++/ArkTS 桥接问题,排查成本直接翻倍。

5. 实测中踩过的坑:调试链路、性能与图标库

5.1 USB 调试链路的问题(hdc 连接、USBManager 的干扰)

真机调试绕不开 hdc。我在 RK3568 开发板上遇到的第一个坑,是插上 USB 线后运行hdc list targets返回空列表。排查顺序很重要,不要乱试:

第一,换线。很多开发板包装里附带的 USB 线其实是纯充电线,没有数据线芯。我踩过这个坑,浪费了半小时,最后换了一根手机数据线立马识别。

第二,查授权。开发板系统默认开启“仅充电”或者“USB 调试未授权”时,你需要在系统设置里打开开发者模式,插线后屏幕上会弹出调试授权请求,点击允许。但开发板经常没有实体屏幕,或者你用的是 SSH 终端登录,这时候授权弹窗会被忽略。解决办法通常是用串口终端或者板卡厂商的工具先进入系统设置,把 USB 调试设为默认允许。

第三,重启 hdc server。这个经验是安卓开发里学来的,在 OpenHarmony 上一样适用:

hdc kill hdc start hdc list targets

顺带说一句,如果你真的在开发 OpenHarmony 的 USB 类应用,比如读写外设、连接 HID 设备,那要关注的是@ohos.usbManager接口,或者基于 libusb 封装的原生能力。RN 的调试链路走的是 hdc,不需要碰 USBManager,这两条线千万不要混在一起。

5.2 渐变背景引发的列表重绘和闪屏问题

我把 SVG 渐变背景接入 TodoList 后,遇到了一个很有代表性的问题:列表滚动的时候,背景偶尔会出现一条一条的闪烁,像是有半透明的条纹在刷,严重时整个背景会闪白。

排查过程是这样的。一开始我怀疑是 SVG 背景刷新太频繁,于是先把pointerEvents="none"加上,没用;然后我怀疑是Rect的尺寸定义有问题,把width="100%"改成了固定像素值,情况好了一点但没根治;最后我观察到一个规律,只要 FlatList 的滚动速度一快,闪烁频率就升高,几乎可以断定是列表区域的渲染和背景层的合成出现了冲突。

在 RNOH 的早期版本里,FlatList 底层映射到 ArkUI 的滚动容器,滚动容器的 RenderNode 和它下面的 SVG 背景层在某些 GPU 驱动上会出现合成顺序问题。解决办法也很务实:把背景层单独放在一个原生 View 里,FlatList 作为兄弟节点,而不是让背景层和列表在同一个节点树里交叉。我最终的层级结构是这样:

<View style={styles.root}> <GradientBackground /> // SVG 背景层,纯展示 <View style={styles.content}> <FlatList ... /> </View> </View>

GradientBackground内部只负责渲染 SVG,不放任何业务内容,也不参与列表布局。这样 ArkUI 的合成器会把背景层视为一个静止图层,滚动时只需要反复合成滚动内容的图层,闪烁问题就消失了。

另外还有一个隐藏的坑:如果把一段渐变状态的判断放在 TodoItem 组件内部,比如某个待办完成时背景变淡,会导致列表项频繁改变背景样式。在低端开发板上,这会让 FlatList 的复用策略失效。我的建议是:背景渐变是“全局静态”的,不要和列表项的动态状态耦合。

5.3 lucide 图标库在 RNOH 的可用性

图标库的选择也是 TodoList 绕不开的环节。删除按钮、完成按钮如果都用文字替代,交互上总差一点意思。我在项目里选了 lucide 这套开源图标,它在 RN 生态里的接入方式是lucide-react-native,底层依赖react-native-svg

既然上一章已经在项目里引入了 react-native-svg,那么再引入 lucide-react-native,逻辑上就是顺理成章的:

npm install react-native-svg lucide-react-native

实际使用很直接,和普通 RN 项目没有区别:

import { Trash2, CheckCircle2, Circle } from 'lucide-react-native'; // 在 TodoItem 内 <Pressable onPress={() => onToggle(item.id)}> {item.completed ? <CheckCircle2 color="#22c55e" size={20} /> : <Circle color="#ffffff" size={20} />} </Pressable> <Pressable onPress={() => onRemove(item.id)}> <Trash2 color="#f87171" size={20} /> </Pressable>

这里有一个需要留意的版本问题。lucide-react-native会跟随上游 lucide 的发布节奏更新,而它依赖的 react-native-svg 版本可能跟着升级。RNOH 社区维护的 react-native-svg 版本不一定总能同步到最新,如果你直接安装 lucide 的最新版本,很有可能会拉到一个不兼容的 react-native-svg。我建议在 package.json 里显式锁定版本,像这样:

{ "react-native-svg": "13.14.0", "lucide-react-native": "0.263.0" }

版本号以你实际安装的能跑通的那一组为准,记录下来,保证团队其他人拉同一份依赖时不会出错。

6. 一点真实的个人体会

项目做完,我最强烈的感触是:RNOH 已经不是“演示还行、实用还早”的阶段了。基础组件、状态更新、FlatList 列表渲染、SVG 图形能力,我在 TodoList 里扫过一遍后,发现已经能支撑相当一部分生产的轻量级界面。

但我也必须诚实地说,从“能跑 Hello World”到“敢上生产项目”,中间隔着的就是渐变背景这种看似小实则牵一发动全身的细节。它让你被迫去理解 RNOH 的原生桥接机制、渲染层级关系、第三方依赖的兼容策略。而这些理解,比单纯多写几个页面值钱得多。

如果你打算在 OpenHarmony 上长期做 RN 开发,我最后给三条建议:

第一,一定要有一台真机常备身边,模拟器永远替代不了真机在 GPU 合成、USB 调试链路上的真实表现。第二,任何第三方库,先查它有没有 ohos 目录或者社区适配版本,再决定是否引入;没有适配的库,最好先用纯 JS 替代方案。第三,学会看 hilog 日志。RNOH 的 JS 侧报错往往只是表象,真正的问题藏在 hilog 里,hdc shell hilog | grep ReactNative这行命令会是排查疑难杂症时最值得信任的伙伴。

TodoList 只是个开始,后续我会继续把持久化、路由、网络请求这些生产必需能力挨个搬到 RNOH 上做验证,到时候再写文章分享实测结论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 10:33:52

会议录音转文字工具怎么选?四款AI纪要工具实测对比

开选会议录音转文字工具那阵子&#xff0c;我差点被参数表逼疯。各家都说自己识别准、功能全、有AI&#xff0c;但真拿一段40分钟的周会录音扔进去&#xff0c;出来的东西差距能大到让你怀疑人生。用了大半个月&#xff0c;把飞书妙记、讯飞听见、通义听悟、腾讯会议AI小助手这…

作者头像 李华
网站建设 2026/9/9 10:33:43

UKF无迹卡尔曼滤波在线参数辨识实战:锂电池一阶RC模型

做电池管理系统、电机控制或者任何“模型里带未知参数”的工程&#xff0c;大概率都经历过一个尴尬阶段&#xff1a;模型方程写得明明白白&#xff0c;但参数要么拿不准&#xff0c;要么跑着跑着就漂了。电池内阻随温度、SOC、循环次数变化&#xff0c;电机电感电阻随工况漂移&…

作者头像 李华
网站建设 2026/9/9 10:32:27

多功能ALU部件设计实战:从Verilog仿真到FPGA上板验证的完整复盘

数字逻辑与部件设计这门课的第十二个任务&#xff0c;现在初赛阶段终于告一段落。说实话&#xff0c;交板子那一刻心态很复杂&#xff0c;既有“总算把功能跑通”的松快&#xff0c;也清楚后面还有一堆优化和扩展等着做。这轮做的是一位多功能算术逻辑运算部件&#xff0c;简称…

作者头像 李华
网站建设 2026/9/9 10:31:19

国产FPGA管脚兼容替代Xilinx Artix-7实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/9 10:30:25

宽度对比自动化实战:基于Playwright的视觉回归测试方案

这两年做自动化测试&#xff0c;越来越觉得行业里有个挺有意思的现象&#xff1a;大家张口闭口都在谈自动化&#xff0c;但真正把"自动化"当成一个系统性工程来对待的人&#xff0c;其实并不多。就拿我最近在搞的这个"宽度对比&#xff08;自动化&#xff09;&q…

作者头像 李华
网站建设 2026/9/9 10:28:58

STM32驱动HS-S37A非接触式水位传感器并OLED显示完整实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华