不变违规:本机模块不能为空。错误仅显示在 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 --&gt; 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 应用程序

模块 AppRegistry 不是注册的可调用模块

在使用 React Native 的 IOS 运行时出现“未处理的 JS 异常:本机模块不能为空”错误

不变违规:元素类型无效 - React Native

不变违规:不变违规:尝试从未标记为“本机”的节点获取本机标记 - 反应导航更新导致崩溃

不变违规:“RNSVGSvgView”的本机组件不存在