切换分支后Flutter应用运行失败 permission_handler编译报错
问题根因
构建失败由两个因素共同导致:
- 项目依赖的
permission_handler 8.3.0插件Android端代码,调用了两个在Android SDK 31+版本中被标记为废弃的PackageManagerAPI:queryIntentActivities(Intent,int)、getPackageInfo(String,int),编译时触发废弃警告 - 项目Android编译配置开启了
-Werror参数,会将所有Java编译警告直接判定为错误,直接中断编译流程
分支切换只是触发场景,本质是新分支的依赖锁定版本、编译SDK版本、编译参数组合触发了该问题,和切分支操作本身没有直接关系。
修复方案
方案1:升级permission_handler依赖(推荐,长期有效)
适用场景:项目可正常升级依赖,无版本锁定限制permission_handler在8.3.0之后的版本已经完成了高版本Android SDK的API适配,修复了废弃API调用问题,升级即可从根源解决:
- 打开项目根目录的
pubspec.yaml文件 - 找到
permission_handler依赖项,将版本调整为适配当前Flutter版本的稳定版,示例:
dependencies: flutter: sdk: flutter permission_handler: ^10.4.5 # 可根据项目Flutter SDK版本选择对应兼容版本
- 依次执行以下命令更新依赖、清理缓存后重新启动应用:
flutter pub get flutter clean flutter run
方案2:关闭-Werror编译校验(临时方案,快速恢复构建)
适用场景:短期需要快速跑通项目,暂时无法升级插件
如果暂时不能调整插件版本,可以修改编译配置,关闭「警告即错误」的校验规则,跳过该编译拦截:
- 打开
android/app/build.gradle文件 - 在
android配置块中添加/修改如下配置:
android { // 原有其他配置保持不变 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 warningsAsErrors false // 关闭Java编译警告报错 } // 如果项目接入了Kotlin,需要同步添加以下配置 kotlinOptions { jvmTarget = '1.8' allWarningsAsErrors = false // 关闭Kotlin编译警告报错 } }
- 如果上述配置不生效,打开
android/gradle.properties文件,添加如下配置:
org.gradle.jvmargs=-Xmx2048m -Werror=false
- 执行
flutter clean清理缓存后重新构建即可。
方案3:固定编译SDK版本(老项目兼容方案)
适用场景:历史项目无法升级插件、也不能调整编译校验规则
这两个API的废弃标记是从Android 12(SDK 31)开始加入的,将编译SDK版本固定为30即可避免触发该警告:
- 打开
android/app/build.gradle文件 - 找到
compileSdkVersion配置项,修改为:
android { compileSdkVersion 30 // 固定为30,不要使用31及以上版本 defaultConfig { // 其余配置保持不变 } }
- 清理缓存后重新构建即可。注意:过低的编译SDK版本可能导致其他依赖高版本SDK的插件无法正常编译,仅作为兼容老项目的备选方案。
排查验证步骤
- 每次修改配置后必须先执行
flutter clean清除历史构建缓存,避免旧产物干扰编译结果 - 如果修改依赖后版本不生效,可删除Flutter SDK下
.pub-cache/hosted/pub.dartlang.org/路径中的permission_handler-8.3.0文件夹,再重新执行flutter pub get拉取依赖 - 检查新分支下的
pubspec.lock文件,确认permission_handler的实际解析版本和配置版本一致,避免分支的依赖锁定规则导致升级不生效
内容的提问来源于stack exchange,提问作者Arjun Malhotra
相关产品推荐
相关产品推荐

