Flutter location3.2.4 onRequestPermissionsResult重写报错修复
问题根因
location: ^3.2.4为2020年发布的历史版本,升级targetSdkVersion至32后,和配套的AndroidX依赖、Kotlin编译环境、AGP版本存在三层不兼容,是所有报错的核心来源:
- 旧版插件内置的
FlutterLocationService.kt中onRequestPermissionsResult方法签名,和当前AndroidX Fragment/Activity的权限回调签名不匹配,直接将参数改为非空类型会触发插件内原有方法的重载冲突 - 网络流传的gustysetyono修复补丁仅适配AGP 7.x版本,触发插件内置的AGP版本校验逻辑,抛出
Unsupported Android Plugin version: 4.2.2异常 - IDE侧ToolWindowDragHelper空指针为Android Studio Arctic Fox及以上版本和旧版Gradle插件的已知UI兼容bug,不影响实际编译流程,无需优先处理
分步修复方案
第一步:固定全局编译版本,消除依赖漂移
打开项目根目录下android/build.gradle,固定核心构建依赖版本,禁止使用动态版本号:
buildscript { ext.kotlin_version = '1.5.31' repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:4.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }
打开android/gradle/wrapper/gradle-wrapper.properties,固定Gradle版本为和AGP 4.2.2匹配的6.7.1版本:
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
打开android/app/build.gradle,调整编译配置并锁死核心依赖版本,避免自动升级触发兼容问题:
android { compileSdkVersion 32 defaultConfig { minSdkVersion 21 targetSdkVersion 32 // 原有其余配置保持不变即可 } configurations.all { resolutionStrategy { force 'androidx.core:core-ktx:1.6.0' force 'androidx.appcompat:appcompat:1.3.1' } } }
第二步:本地修补location插件,解决编译冲突
不要直接修改Pub缓存中的插件代码(执行flutter pub get后缓存会被重置),通过本地依赖覆盖的方式永久修补:
- 执行
flutter pub cache repair定位Pub缓存路径,找到location-3.2.4版本的android源码目录,对应Kotlin文件路径为android/src/main/kotlin/com/lyokone/location/FlutterLocationService.kt - 定位到149行附近的
onRequestPermissionsResult方法,不要直接修改参数可空性,直接删除原有旧方法,替换为如下实现:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { if (requestCode != REQUEST_PERMISSIONS_REQUEST_CODE) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) return } val isAllGranted = grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED } val result = if (isAllGranted) { grantResults } else { IntArray(grantResults.size) { PackageManager.PERMISSION_DENIED } } onRequestPermissionsResultListener?.onRequestPermissionsResult(result) }
- 打开同目录下的
LocationPlugin.kt文件,直接注释掉整个AGP版本校验逻辑(就是抛出Unsupported Android Plugin version异常的判断代码块) - 将修补完成的整个
location-3.2.4目录复制到项目根目录下的third_party/location路径,在项目根目录pubspec.yaml中添加依赖覆盖配置,避免后续Pub操作重置修改:
dependency_overrides: location: path: ./third_party/location
第三步:清理缓存重新构建
按顺序执行以下命令清理构建缓存:
- 进入
android目录执行./gradlew clean(Windows系统执行gradlew.bat clean) - 回到项目根目录执行
flutter clean - 执行
flutter pub get后重新编译即可正常部署到Android设备
关于IDE侧ToolWindowDragHelper空指针弹窗:该问题为Android Studio旧版本UI组件bug,不影响编译和运行,如果需要消除弹窗,将Android Studio升级到2022.1.1(Chipmunk)及以上稳定版即可修复。
内容的提问来源于stack exchange,提问作者nty51
相关产品推荐
相关产品推荐

