Expo集成react-native-purchases报Native module cannot be null错误
报错原因
Expo 托管工作流默认不会自动链接未做Expo适配的原生React Native模块,你直接安装裸RN生态的react-native-purchases且未做任何原生端配置时,JS层找不到对应的原生实现,就会触发Invariant Violation: Native module cannot be null报错。
解决方法
根据你的项目是否要保留托管工作流,二选一即可:
- 保留Expo托管工作流(无需eject,推荐)
- 先卸载当前安装的不适配版本:
npm uninstall react-native-purchases - 安装Expo适配版的依赖和对应的配置插件:
npx expo install react-native-purchases npx expo install @config-plugins/react-native-purchases - 打开项目根目录的
app.json,在expo配置下的plugins数组中加入RevenueCat插件配置,示例:{ "expo": { // 其他原有配置保留 "plugins": [ [ "@config-plugins/react-native-purchases", { "ios": { "podVersion": "4.6.0" } } ] ] } } - 执行
npx expo prebuild重新生成原生工程目录,再通过expo run:ios或expo run:android构建自定义开发客户端调试即可。注意默认的Expo Go客户端不包含该原生模块,必须用自定义构建的开发客户端才能正常运行。
- 先卸载当前安装的不适配版本:
- 切换到Expo裸工作流
执行npm run eject弹出原生工程后,补全iOS端的Pod依赖、StoreKit框架引入、必要权限配置,以及Android端的仓库地址、Manifest配置,重新构建原生应用即可正常加载模块。
额外注意事项
- 如果你是在运行Jest单元测试时触发该报错,需要在测试配置中手动mock
react-native-purchases模块,避免测试环境尝试加载不存在的原生模块,示例mock代码:jest.mock('react-native-purchases', () => ({ setupPurchases: jest.fn(), getOfferings: jest.fn(), purchasePackage: jest.fn(), // 按需补充你项目中实际用到的所有方法即可 })) - 所有依赖原生代码的第三方RN包,在Expo托管流中都需要对应配置插件做预构建处理,直接npm安装后直接运行必然会报原生模块为空的错误。
内容的提问来源于stack exchange,提问作者Nima Pourjafar
相关产品推荐
相关产品推荐

