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
相关产品推荐
相关产品推荐

