不变违规:本机模块不能为空。错误仅显示在 iOS 上
Posted
技术标签:
【中文标题】不变违规:本机模块不能为空。错误仅显示在 iOS 上【英文标题】:Invariant Violation: Native Module cannot be Null. Error only showing up on iOS 【发布时间】:2021-04-15 14:28:33 【问题描述】:背景 近一年来,我一直在开发由 Expo 管理的 React Native 应用程序,但由于当时我既没有 Mac 也没有 iPhone,所以无法在 ios 上对其进行测试。 我设法购买了一部 iPhone 8,今天我尝试在其上运行该应用程序,但没有结果。
问题 我得到一个不变的违规:尝试运行应用程序时,本机模块不能为空。 错误堆栈在 VS Code 中如下所示:
Invariant Violation: Native module cannot be null.
- node_modules\react-native\Libraries\LogBox\LogBox.js:148:8 in registerError
- node_modules\react-native\Libraries\LogBox\LogBox.js:59:8 in errorImpl
- node_modules\react-native\Libraries\LogBox\LogBox.js:33:4 in console.error
- node_modules\expo\build\environment\react-native-logs.fx.js:27:4 in error
- node_modules\react-native\Libraries\Core\ExceptionsManager.js:104:6 in reportException
- node_modules\react-native\Libraries\Core\ExceptionsManager.js:171:19 in handleException
- node_modules\react-native\Libraries\Core\setUpErrorHandling.js:24:6 in handleError
- node_modules\expo-error-recovery\build\ErrorRecovery.fx.js:9:32 in ErrorUtils.setGlobalHandler$argument_0
- node_modules\regenerator-runtime\runtime.js:63:36 in tryCatch
- node_modules\regenerator-runtime\runtime.js:293:29 in invoke
- node_modules\regenerator-runtime\runtime.js:63:36 in tryCatch
- node_modules\regenerator-runtime\runtime.js:154:27 in invoke
- node_modules\regenerator-runtime\runtime.js:164:18 in PromiseImpl.resolve.then$argument_0
- node_modules\react-native\node_modules\promise\setimmediate\core.js:37:13 in tryCallOne
- node_modules\react-native\node_modules\promise\setimmediate\core.js:123:24 in setImmediate$argument_0
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:130:14 in _callTimer
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:181:14 in _callImmediatesPass
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:441:30 in callImmediates
- node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:387:6 in __callImmediates
- node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135:6 in __guard$argument_0
- node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:364:10 in __guard
- node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:134:4 in flushedQueue
* [native code]:null in flushedQueue
* [native code]:null in invokeCallbackAndReturnFlushedQueue
这些屏幕截图显示了我在手机上看到的内容:
如果我尝试按照我编写的屏幕的链接进行操作,而不是我在这些 sn-ps 代码中找到的随机 node_modules 依赖项:
过滤器
<View style=styles.check>
<Text style=styles.propName>Happy hour</Text>
<CheckBox
value=selectedExtra ? true : extra3
onValueChange=() => setExtra3(!extra3)
tintColors=tintColors
/>
</View>
个人资料屏幕
<TouchableOpacity style=styles.listItem onPress=() => navigation.navigate('yourPurchases')>
<Text style=styles.listText>Your orders</Text>
<View style=styles.greyArrow>
<GreyArrow />
</View>
</TouchableOpacity>
(灰色箭头和样式表导入很好。导航和其他一切都可以在 android 上完美运行)。
我的尝试
应用程序在 Android 上完美运行,遇到 0 个问题。我尝试过npx react-native link
,卸载并重新安装所有依赖项,首先在 Android 上构建和运行,然后在 iOS 上运行。
由于这是一个博览会托管应用程序,据我所知,我不能使用“cd /ios --> pod install
”方法。
问题
如何让应用在 iOS 上运行以及导致崩溃的原因是什么?
提前非常感谢!
【问题讨论】:
【参考方案1】:您似乎添加了一个具有原生 iOS 部分且不属于 Expo 的库。如果有 iOS 文件夹,你应该检查你的 package.json 和 Github 上的每个库检查。如果这个库没有提到任何关于 Expo 的内容,并且 Expo 也没有在他们的网站上显示它以与托管项目兼容,这可能是原因,您需要找到替代方案或退出。
【讨论】:
【参考方案2】:我过去经常看到这个错误。 ios原生模块未正确安装时会出现此问题。您应该为 ios 安装本机模块。
在你的 react-native 项目中进行下一步
cd ios
rm -rf Pods Podfile.lock
pod install
yarn ios
谢谢!
【讨论】:
嘿,正如我在帖子中指定的那样,我不能这样做,因为它是一个博览会管理的应用程序。 哦,对不起。我错过了。太麻烦了【参考方案3】:如果您使用较旧的 EXPO 版本,请将其更新到最新版本。首先卸载它并运行npm install -g expo-cli
。
然后清除您的节点模块文件夹并运行npm install
以再次安装节点模块。
【讨论】:
以上是关于不变违规:本机模块不能为空。错误仅显示在 iOS 上的主要内容,如果未能解决你的问题,请参考以下文章
不变违规:本机模块不能为空。 React Native Firebase 应用程序
在使用 React Native 的 IOS 运行时出现“未处理的 JS 异常:本机模块不能为空”错误