Flutter项目报错:Android资源style/Theme.MaterialComponents未找到
Flutter Android项目Theme.MaterialComponents资源找不到问题解决
问题背景
开发Flutter项目时,尝试为Activity使用Theme.AppCompat子类主题,运行代码时出现资源链接错误。
相关代码
/android/app/src/main/res/values/styles.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> <!-- Show a splash screen on the activity. Automatically removed when Flutter draws its first frame --> <item name="android:windowBackground">@drawable/launch_background</item> </style> <!-- Theme applied to the Android Window as soon as the process has started. This theme determines the color of the Android Window while your Flutter UI initializes, as well as behind your Flutter UI while its running. This Theme is only used starting with V2 of Flutter's Android embedding. --> <style name="NormalTheme" parent="Theme.MaterialComponents"> <item name="android:windowBackground">?android:colorBackground</item> </style> </resources>
/android/app/src/main/res/values-night/styles.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> <!-- Show a splash screen on the activity. Automatically removed when Flutter draws its first frame --> <item name="android:windowBackground">@drawable/launch_background</item> </style> <!-- Theme applied to the Android Window as soon as the process has started. This theme determines the color of the Android Window while your Flutter UI initializes, as well as behind your Flutter UI while its running. This Theme is only used starting with V2 of Flutter's Android embedding. --> <style name="NormalTheme" parent="Theme.MaterialComponents"> <item name="android:windowBackground">?android:colorBackground</item> </style> </resources>
/android/app/build.gradle
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply plugin: 'com.google.gms.google-services' def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.xxx.xxx" minSdkVersion 23 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. minifyEnabled false shrinkResources false signingConfig signingConfigs.release } } } flutter { source '../..' } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation platform('com.google.firebase:firebase-bom:28.4.2') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-firestore:24.0.2' }
错误信息
* What went wrong: Execution failed for task ':app:processDebugResources'. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction > Android resource linking failed ERROR:AAPT: error: resource style/Theme.MaterialComponents (aka com.peresiaapp.peresia_customer:style/Theme.MaterialComponents) not found. error: resource style/Theme.MaterialComponents (aka com.peresiaapp.peresia_customer:style/Theme.MaterialComponents) not found. error: failed linking references.
解决办法
问题原因
Theme.MaterialComponents是Material Components库提供的主题,你的项目未添加该库的依赖,导致编译时无法找到对应的资源。
方案一:添加Material Components依赖
在/android/app/build.gradle的dependencies代码块中添加Material Components库的依赖:
implementation 'com.google.android.material:material:1.7.0'
(版本号可根据compileSdkVersion调整,比如compileSdk 31适配1.5及以上版本)
添加后同步Gradle项目,重新编译即可。
方案二:改用AppCompat主题
如果不需要Material Components特性,可直接将styles.xml中的主题父类改为AppCompat系列主题,比如:
将parent="Theme.MaterialComponents"替换为parent="Theme.AppCompat.Light.NoActionBar"(或其他AppCompat子类主题),无需额外添加依赖。
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

