You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后缓存会被重置),通过本地依赖覆盖的方式永久修补:

  1. 执行flutter pub cache repair定位Pub缓存路径,找到location-3.2.4版本的android源码目录,对应Kotlin文件路径为android/src/main/kotlin/com/lyokone/location/FlutterLocationService.kt
  2. 定位到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)
}
  1. 打开同目录下的LocationPlugin.kt文件,直接注释掉整个AGP版本校验逻辑(就是抛出Unsupported Android Plugin version异常的判断代码块)
  2. 将修补完成的整个location-3.2.4目录复制到项目根目录下的third_party/location路径,在项目根目录pubspec.yaml中添加依赖覆盖配置,避免后续Pub操作重置修改:
dependency_overrides:
  location:
    path: ./third_party/location

第三步:清理缓存重新构建

按顺序执行以下命令清理构建缓存:

  1. 进入android目录执行./gradlew clean(Windows系统执行gradlew.bat clean)
  2. 回到项目根目录执行flutter clean
  3. 执行flutter pub get后重新编译即可正常部署到Android设备

关于IDE侧ToolWindowDragHelper空指针弹窗:该问题为Android Studio旧版本UI组件bug,不影响编译和运行,如果需要消除弹窗,将Android Studio升级到2022.1.1(Chipmunk)及以上稳定版即可修复。


内容的提问来源于stack exchange,提问作者nty51

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:22:03