升级Expo SDK 46后应用无法运行,求助解决两类核心报错
问题解决指南:Expo SDK46升级后报错及Google Play审核问题
一、核心问题背景
修正隐私政策链接后,因广告ID/分析问题被Google Play拒审,升级Expo SDK46(该版本已修复无广告场景下的广告ID问题)后,现有代码迁移出现两类报错,但新建SDK46项目可正常运行。
二、报错1:TypeError: undefined is not an object (evaluating '_reactNative.Text.propTypes.style')
问题原因
SDK46对应的React Native 0.69+已废弃内置propTypes,部分第三方依赖仍在引用旧版react-native中的Text.propTypes等API,导致找不到对应对象。
解决方案
- 排查未适配的第三方库
运行npm ls deprecated-react-native-prop-types,查看哪些依赖未适配RN0.69+,优先升级这些库到最新版本。若无法升级,需手动为该库添加deprecated-react-native-prop-types依赖。 - 配置Metro别名兜底
在项目根目录创建/修改metro.config.js,将旧版propTypes路径指向兼容包:const { getDefaultConfig } = require('@expo/metro-config'); const config = getDefaultConfig(__dirname); config.resolver.alias = { ...config.resolver.alias, 'react-native/lib/TextPropTypes': 'deprecated-react-native-prop-types', 'react-native/Libraries/Components/View/ViewPropTypes': 'deprecated-react-native-prop-types', }; module.exports = config; - 彻底清除缓存
执行npx expo start --clear,清除Metro及Expo缓存后重启项目。
三、报错2:Invariant Violation: "main" has not been registered
问题原因
入口文件配置错误、模块加载失败(如依赖缺失/路径错误),导致AppRegistry未完成组件注册。
解决方案
- 核对入口配置
对比新建SDK46项目的app.json,确保expo.entryPoint指向正确路径(如./index.js),示例:{ "expo": { "entryPoint": "./index.js", // 其他配置... } } - 规范入口文件写法
在index.js中使用Expo官方推荐的注册方式,避免直接调用AppRegistry.registerComponent:import { registerRootComponent } from 'expo'; import App from './App'; registerRootComponent(App); - 排查模块加载错误
查看Metro启动日志,优先解决“模块找不到”“循环依赖”等前置错误,这些问题会导致App组件无法正常加载,进而触发注册失败。 - 清理无效依赖
删除项目中未使用的广告相关依赖(如expo-ads-admob、react-native-google-mobile-ads等),避免与SDK46的默认配置冲突。
四、Google Play广告ID问题补充验证
升级SDK46后,需确保app.json中禁用广告相关配置,避免审核触发:
{ "expo": { "android": { "config": { "googleServicesAds": { "enabled": false } } } } }
五、通用修复步骤
- 删除
node_modules、package-lock.json/yarn.lock文件; - 执行
npx expo install,重新安装SDK46兼容的依赖; - 再次执行
npx expo start --clear启动项目。
内容的提问来源于stack exchange,提问作者Ahmad Abdulkadir
相关产品推荐
相关产品推荐

