Flutter定位如何设置distanceFilter?解决设置无效及LocationAccuracy未定义问题
核心问题根因
- 配置方法挂载对象错误:
changeSettings是定位服务实例(即代码中的_locationTracker)的内置方法,不属于getLocation()返回的单次位置数据实体。在拿到的location变量上调用该方法,相当于在纯数据对象上访问不存在的方法,编译器会因为找不到方法签名,连带将参数中要求的LocationAccuracy枚举判定为未定义,直接触发编译报错。 - 配置时机滞后于流订阅初始化:现有逻辑是先发起单次定位、再触发位置更新流的监听,最后才尝试修改配置。即使修正了方法的调用对象,晚于流订阅的配置修改也可能不即时生效,导致位置流沿用系统默认配置——默认配置下距离过滤器为0,只要定位模块有微小漂移就会推送位置更新,直接造成无位移状态下的无效数据噪声。
- 缺少显式的定位精度声明:默认定位模式可能切换为高频高功耗定位,进一步放大静态漂移的无效推送量。
修复实现方案
- 删除当前代码中错误的
location.changeSettings(interval: 3000, distanceFilter: 10.0);行 - 在初始化位置更新流订阅之前,直接通过定位服务实例调用配置方法,补全所有参数,正确实现如下:
void getCurrentLocation() async { try { Uint8List imageData = await getMarker(); var location = await _locationTracker.getLocation(); // 位置流订阅初始化前完成全局定位配置 _locationTracker.changeSettings( accuracy: LocationAccuracy.high, interval: 3000, distanceFilter: 10.0, ); if (_locationSubscription != null) { _locationSubscription.cancel(); } updateMarkerAndCircle(location, imageData); _locationSubscription = _locationTracker.onLocationChanged().listen((newLocalData) { if (_controller != null) { _controller.animateCamera(CameraUpdate.newCameraPosition( new CameraPosition( bearing: 192.8334901395799, target: LatLng(newLocalData.latitude, newLocalData.longitude), tilt: 0, zoom: 18.00))); updateMarkerAndCircle(newLocalData, imageData); } routesCoordinates.currentLocation = LatLng(newLocalData.latitude, newLocalData.longitude); if (routesCoordinates.inCourse) { routesCoordinates.upDateCurrentLocation(); routesCoordinates.latlngSendBackEnd.add({ "lat_lng": LatLng(newLocalData.latitude, newLocalData.longitude), "date": DateTime.now().toString(), }); drawPolyLine.latlng .add(LatLng(newLocalData.latitude, newLocalData.longitude)); drawPolyLine.drawPolyLine(); } }); } on PlatformException catch (e) { if (e.code == 'PERMISSION_DENIED') { debugPrint("Permission Denied"); } } }
落地注意事项
- 配置生效后,
distanceFilter: 10.0会按照规则触发更新:仅当设备相对上次推送位置的实际移动距离超过10米时,才会推送新的位置回调,静态状态下的微小定位漂移会被直接过滤,从根源上减少无效数据噪声。 - 此前出现的
LocationAccuracy未定义报错,本质是错误的方法调用导致编译器无法解析方法签名,将调用对象修正为_locationTracker后,只要正常导入定位服务主包,枚举会被自动解析,无需额外单独导入枚举定义。 - 单次定位返回的位置对象仅承载经纬度、定位时间戳、精度半径等数据,不存在修改全局定位服务行为的接口,禁止在该对象上调用定位配置类方法。
内容的提问来源于stack exchange,提问作者Caio Beraldi Ribeiro
相关产品推荐
相关产品推荐

