React Native集成react-native-activity-recognition遇NativeEventEmitter报错求助
解决React Native 0.70.1 + Hermes集成react-native-activity-recognition的报错问题
报错分析
核心错误是Invariant Violation: new NativeEventEmitter() requires a non-null argument.,这说明react-native-activity-recognition的原生模块未正确注册到React Native环境中,进而引发后续的AppRegistry初始化失败问题。
解决方案
1. 确认原生模块链接状态
React Native 0.60+支持自动链接,但部分场景下可能失效,需手动验证:
Android端:
- 打开
android/settings.gradle,确认包含以下代码:include ':react-native-activity-recognition' project(':react-native-activity-recognition').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-activity-recognition/android') - 打开
android/app/build.gradle,确认dependencies块中存在:implementation project(':react-native-activity-recognition') - 检查
MainApplication.java的getPackages()方法,是否添加了new ActivityRecognitionPackage()(自动链接会自动添加,若缺失则手动补充)。
- 打开
iOS端:
- 打开
ios/Podfile,确认包含:pod 'react-native-activity-recognition', :path => '../node_modules/react-native-activity-recognition' - 执行
cd ios && pod install --repo-update重新安装依赖。 - 检查
AppDelegate.m,确认已导入模块并注册(自动链接完成后无需手动操作,若异常可手动添加)。
- 打开
2. 验证库版本兼容性
确认你安装的react-native-activity-recognition版本支持React Native 0.70.1:
- 查看库的
package.json中的peerDependencies,若版本范围不包含0.70.x,尝试升级库到最新兼容版本:npm install react-native-activity-recognition@latest # 或 yarn add react-native-activity-recognition@latest
3. 修复useEffect的清理函数写法
你的代码中清理函数存在错误,当前写法会在组件挂载时立即调用ActivityRecognition.stop(),而非组件卸载时执行。修改为:
useEffect(() => { const subscription = ActivityRecognition.subscribe(detectedActivities => { const mostProbableActivity = detectedActivities.sorted[0]; console.log(mostProbableActivity); }); return () => { ActivityRecognition.stop(); subscription?.remove(); // 若库支持取消订阅,建议同时调用 }; }, []); // 添加空依赖数组,确保仅挂载时执行一次
4. 清理React Native缓存
缓存问题可能导致模块未正确加载,执行以下命令清理:
# 清除RN打包缓存 npm start --reset-cache # Android端额外清理 cd android && ./gradlew clean # iOS端额外清理 cd ios && rm -rf Pods Podfile.lock && pod install rm -rf ~/Library/Developer/Xcode/DerivedData
5. 检查权限配置
确保已在原生项目中添加了活动识别所需的权限:
- Android:在
AndroidManifest.xml中添加:<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> - iOS:在
Info.plist中添加:<key>NSMotionUsageDescription</key> <string>需要访问您的活动数据以追踪运动状态</string>
内容的提问来源于stack exchange,提问作者Lakpriya Senevirathna
相关产品推荐
相关产品推荐

