Flutter中geolocator与permission_handler的compileSdkVersion冲突如何解决
问题根因
该冲突是由于两个依赖包的适配Android版本范围不重叠导致:permission_handler 8.2.5已经开始适配Android 12(API 31),引用了只有API 31及以上才有的系统符号;而geolocator_android 1.0.0版本仅适配到API 30,使用了API 31中被废弃的接口,且插件默认开启了Werror规则,将废弃API警告直接升级为编译错误。
解决方法
方案1:升级依赖包版本(优先推荐)
这是成本最低的解决方式,两个包的官方新版本已经完成了高版本compileSdk的兼容适配:
- 升级
geolocator到2.0.0及以上版本,对应的geolocator_android依赖会自动升级到适配compileSdk 31+的版本,废弃API触发的Werror问题已被官方修复 - 升级
permission_handler到9.0.0及以上版本,同时确保你的Flutter SDK版本在2.10.0以上,适配Android 12+的权限声明要求
升级完成后将项目全局compileSdkVersion设置为33即可正常编译。
方案2:保留当前依赖版本的适配方案
如果因项目旧兼容逻辑无法升级依赖,可通过修改Android编译配置绕过问题:
- 将项目的
compileSdkVersion统一设置为31 - 打开
android/app/build.gradle文件,在android代码块中添加如下配置,关闭废弃API的错误拦截规则:
android { // 原有项目配置无需修改,新增以下配置 lintOptions { checkReleaseBuilds false abortOnError false disable 'DeprecatedApi' } // 如果你使用的AGP版本为7.0及以上,使用以下配置替换上面的lintOptions /* lint { checkReleaseBuilds = false abortOnError = false disable.add('DeprecatedApi') } */ }
- 同步Gradle配置后重新编译即可,该配置仅修改编译检查规则,不会影响应用的实际运行逻辑和两个依赖包的功能可用性。
可选补充配置
如果编译过程中出现AndroidManifest.xml的android:exported属性冲突,可在android/app/src/main/AndroidManifest.xml的manifest根节点添加tools:replace="android:exported"属性,同时在manifest头部添加xmlns:tools="http://schemas.android.com/tools"声明即可解决。
内容的提问来源于stack exchange,提问作者Arslan Kaleem
相关产品推荐
相关产品推荐

