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

Flutter使用geolocator 7.6.1点击获取位置按钮无法获取当前定位问题

问题触发原因

  • 核心原因:Dart SDK版本与Geolocator依赖版本不兼容。你项目pubspec.yaml中Dart SDK约束为>=2.1.0 <3.0.0,包含非空安全的旧版本,而Geolocator 7.6.1要求Dart SDK最低为2.12.0(空安全版本),版本不匹配会直接引发运行/编译报错。
  • 权限逻辑缺失:仅发起权限请求,未判断权限返回状态,当用户拒绝权限时调用定位接口会直接抛出异常。
  • 缺少位置服务校验:未提前判断设备GPS定位开关是否开启,定位服务关闭时调用接口会报错。
  • Android 12+适配缺失:targetSdkVersion >=31时,缺少对应权限声明会导致定位失败。

解决方法

1. 修正SDK版本约束

修改pubspec.yaml中的environment配置:

environment:
  sdk: ">=2.12.0 <3.0.0"

修改后执行flutter pub get重新拉取依赖,如果提示Flutter版本不匹配,先将Flutter升级到2.0及以上版本。

2. 完善定位逻辑的异常与权限处理

替换loading_screen.dart中的getLocation方法:

Future<void> getLocation() async {
  // 校验位置服务是否开启
  bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    print('位置服务未开启,请先开启设备定位开关');
    return;
  }

  // 校验权限状态
  LocationPermission permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      print('定位权限被拒绝,无法获取位置信息');
      return;
    }
  }

  if (permission == LocationPermission.deniedForever) {
    print('定位权限被永久拒绝,请前往应用设置页开启权限');
    return;
  }

  // 捕获定位异常
  try {
    Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
    print(position);
  } catch (e) {
    print('获取位置失败,错误信息:$e');
  }
}

3. 补充Android 12+权限声明

在AndroidManifest.xml的manifest标签下添加如下权限:

<!-- Android 12及以上定位权限适配 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

4. 清除缓存重新编译

执行flutter clean清除旧的编译缓存,之后重新运行项目即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:42:01