React Native调用Clipboard.setString报null错误但日志打印正常
问题表现
调用剪贴板库方法时抛出如下报错:
TypeError: Cannot read property 'setString' of null
对应调用代码:
import Clipboard from '@react-native-community/clipboard'; /* 此处省略其余业务代码 */ Clipboard.setString("Hello");
异常特征:
- 直接打印
Clipboard对象、Clipboard.setString方法时,日志显示方法确实存在,输出为[Function setString] - 提前加方法存在性判断再调用,依然会抛出相同报错:
Clipboard.setString && Clipboard.setString("Hello"); // 同样触发报错
根本原因
这个问题和项目内其他代码冲突、变量覆盖无关,是React Native原生模块桥接失效的典型表现:
你通过import拿到的Clipboard是库本身提供的JS层占位包装对象,所以在JS层读取对象属性、方法时,都能拿到正常定义的值,不会出现null。
但实际执行setString方法时,JS层的包装逻辑会通过RN桥接层读取iOS/Android原生端注册的Clipboard实例,如果原生端模块没有正确链接、注册,桥接层拿到的原生实例就是null,读取null上的方法时就会抛出上述报错。这个报错发生在桥接通信环节,JS层做的方法存在性判断无法拦截,因为判断的是JS包装对象上的方法是否存在,和桥接层能不能拿到原生实例完全是两个层面的事。
修复步骤
按顺序操作即可解决:
- 先确认依赖安装完整,重新执行依赖安装命令
# npm 使用者 npm install @react-native-community/clipboard --save # yarn 使用者 yarn add @react-native-community/clipboard - 完成原生端链接:
- RN 0.60以下版本:手动执行链接命令
react-native link @react-native-community/clipboard - RN 0.60及以上版本:iOS端进入ios目录执行
pod install重新安装依赖;Android端不需要额外执行link命令,但要确认MainApplication.java的模块列表里没有手动排除Clipboard模块 - 如果项目开启了RN新架构(Fabric/TurboModules),请将clipboard库升级到支持新架构的版本,老版本库不兼容新架构的模块加载逻辑
- RN 0.60以下版本:手动执行链接命令
- 清除缓存重启服务:完全关闭当前运行的metro打包服务,执行
npx react-native start --reset-cache启动带缓存清除的打包服务 - 重新编译安装APP:不要直接用热重载/热更新加载,必须重新执行
react-native run-android或react-native run-ios编译安装,热更新不会加载新链接的原生模块。
补充:如果是Expo托管工作流(managed workflow)的项目,这个库无法直接使用,需要切换到bare工作流,或者使用Expo内置的剪贴板API。
内容的提问来源于stack exchange,提问作者Reece Kenney
相关产品推荐
相关产品推荐

