You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native项目升级后出现cannot find symbol编译错误求助

解决React Native Expo升级后Android编译找不到ReactApplication/ReactNativeHost的问题

这问题我之前帮同事排查过好几次,大概率是升级React时没同步匹配Expo和React Native的版本,或者旧缓存、配置文件残留导致的,给你几个实用的解决步骤:

  • 先核对版本兼容性
    Expo的每个SDK版本都绑定了固定的React和React Native版本范围,乱升级很容易出依赖冲突。打开你的package.json,确认exporeactreact-native的版本是匹配的——比如Expo SDK 50对应React 18.2.0、React Native 0.73.x,SDK 49对应React 18.2.0、React Native 0.72.x。如果版本不匹配,调整后重新执行npm install(或yarn)。

  • 彻底清理Android构建缓存
    旧缓存经常会残留过时的依赖引用,导致找不到类:

    1. 进入项目的android目录:cd android
    2. 执行gradle清理命令:Windows用gradlew clean,Mac/Linux用./gradlew clean
    3. 返回根目录重新安装依赖:npm install
    4. 重新构建项目:npx expo run:android
  • 检查MainApplication.java的配置
    升级后Expo的Application类结构可能有变化,你的MainApplication可能需要调整导入的包或继承关系。正确的示例结构大概是这样:

    import android.app.Application;
    import android.content.res.Configuration;
    import expo.modules.ApplicationLifecycleDispatcher;
    import com.facebook.react.ReactApplication;
    import com.facebook.react.ReactNativeHost;
    import com.facebook.react.defaults.DefaultReactNativeHost;
    import com.facebook.react.PackageList;
    import com.facebook.react.ReactPackage;
    import java.util.List;
    
    public class MainApplication extends Application implements ReactApplication {
      private final ReactNativeHost mReactNativeHost = new DefaultReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
          return BuildConfig.DEBUG;
        }
    
        @Override
        protected List<ReactPackage> getPackages() {
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // 手动添加自定义包的地方
          return packages;
        }
    
        @Override
        protected String getJSMainModuleName() {
          return ".expo/.virtual-metro-entry";
        }
      };
    
      @Override
      public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
      }
    
      @Override
      public void onCreate() {
        super.onCreate();
        ApplicationLifecycleDispatcher.onApplicationCreate(this);
      }
    
      @Override
      public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig);
      }
    }
    

    对比你现有的代码,确保导入的包正确,没有遗漏必要的Expo相关类。

  • 检查Android Gradle配置
    打开android/build.gradle,确认buildscript里包含了React Native的gradle插件依赖:

    buildscript {
      dependencies {
        // 其他依赖...
        classpath("com.facebook.react:react-native-gradle-plugin")
      }
    }
    

    同时android/app/build.gradle里要正确引入React Native的依赖:

    dependencies {
      // 其他依赖...
      implementation "com.facebook.react:react-native:${reactNativeVersion}"
    }
    

    这里的reactNativeVersion应该是在build.gradle里定义的,或者由Expo自动注入。

如果以上步骤都试过还是不行,试试删除node_modulesandroid/.gradleandroid/app/build这几个文件夹,然后重新安装依赖再构建,彻底清除所有旧缓存。

内容的提问来源于stack exchange,提问作者Chris Henry

火山引擎 最新活动