React Native Kotlin Android项目中R与BuildConfig引用未解决
解决React Native Kotlin项目中Unresolved reference: R和BuildConfig错误
版本信息
- React Native版本: 0.74.3
- Kotlin版本: 1.9.23
- Gradle版本: 8.6
- Android Studio版本: 最新
代码片段
MainActivity.kt
package com.thediamlaundry.diamapp import android.os.Build import android.os.Bundle import com.facebook.react.ReactActivity import com.facebook.react.ReactActivityDelegate import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled import com.facebook.react.defaults.DefaultReactActivityDelegate import expo.modules.ReactActivityDelegateWrapper class MainActivity : ReactActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Set the theme to AppTheme BEFORE onCreate to support // coloring the background, status bar, and navigation bar. // This is required for expo-splash-screen. setTheme(R.style.AppTheme); super.onCreate(null) } /** * Returns the name of the main component registered from JavaScript. This is used to schedule * rendering of the component. */ override fun getMainComponentName(): String = "main" /** * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] */ override fun createReactActivityDelegate(): ReactActivityDelegate { return ReactActivityDelegateWrapper( this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, object : DefaultReactActivityDelegate( this, mainComponentName, fabricEnabled ){}) } /** * Align the back button behavior with Android S * where moving root activities to background instead of finishing activities. */ override fun invokeDefaultOnBackPressed() { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { if (!moveTaskToBack(false)) { // For non-root activities, use the default implementation to finish them. super.invokeDefaultOnBackPressed() } return } // Use the default back button implementation on Android S // because it's doing more than [Activity.moveTaskToBack] in fact. super.invokeDefaultOnBackPressed() } }
MainApplication.kt
package com.thediamlaundry.diamapp import android.app.Application import android.content.res.Configuration import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.ReactHost import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.soloader.SoLoader import expo.modules.ApplicationLifecycleDispatcher import expo.modules.ReactNativeHostWrapper class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( this, object : DefaultReactNativeHost(this) { override fun getPackages(): List<ReactPackage> { // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); return PackageList(this).packages } override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED } ) override val reactHost: ReactHost get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) override fun onCreate() { super.onCreate() SoLoader.init(this, false) if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // If you opted-in for the New Architecture, we load the native entry point for this app. load() } ApplicationLifecycleDispatcher.onApplicationCreate(this) } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) } }
构建错误信息
> Task :app:compileReleaseKotlin FAILED e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainActivity.kt:18:14 Unresolved reference: R e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainActivity.kt:35:11 Unresolved reference: BuildConfig e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:31:60 Unresolved reference: BuildConfig e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:33:52 Unresolved reference: BuildConfig e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:34:51 Unresolved reference: BuildConfig e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:44:9 Unresolved reference: BuildConfig
解决方案
- 排查资源文件错误:R类无法生成通常是res目录下的资源文件(布局、样式、drawable等)存在语法问题,比如XML标签未闭合、资源命名包含大写字母或特殊字符。打开res目录下的文件,修复所有红标提示的错误后重新同步Gradle。
- 确认BuildConfig生成配置:在app模块的
build.gradle.kts(或build.gradle)中,确保开启BuildConfig生成,并正确配置所需字段:android { buildFeatures { buildConfig = true // Gradle 7+默认开启,但需确认未被关闭 } defaultConfig { applicationId "com.thediamlaundry.diamapp" buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", "false") buildConfigField("boolean", "IS_HERMES_ENABLED", "true") } } - 执行完整清理重建流程:
- 运行
./gradlew clean清理构建缓存 - 运行
./gradlew assembleRelease --refresh-dependencies强制刷新依赖并重新构建 - 重启Android Studio,清除IDE缓存(路径:
File → Invalidate Caches... → 勾选Clear file system cache and local history → Invalidate and Restart)
- 运行
- 检查包名一致性:确认MainActivity.kt、MainApplication.kt的包名
com.thediamlaundry.diamapp与app模块build.gradle中的applicationId完全一致,包名不匹配会导致R和BuildConfig类无法生成到对应包路径下。 - 修复Expo原生代码兼容性:由于项目使用Expo,执行
npx expo prebuild --clean重新生成Android原生代码文件,确保Expo模块与React Native版本兼容。若问题仍存在,尝试更新expo相关依赖到与React Native 0.74.3匹配的最新版本。
内容的提问来源于stack exchange,提问作者pratik bhattarai
相关产品推荐
相关产品推荐

