flutter_osm_plugin:onLocationChanged回调仅初始化触发,GPS定位正常
Flutter中flutter_osm_plugin的onLocationChanged回调失效问题解决办法
问题背景
使用flutter_osm_plugin开发地图应用时,已设置trackMyPosition: true,地图上的用户位置标记能随移动正常更新,但onLocationChanged回调仅在地图加载时触发一次,后续位置变化不再执行回调逻辑(示例中尝试更新计数器验证)。定位权限(ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION)已正确配置,核心需求是在用户位置变化时执行数据库数据获取操作,不强制依赖插件自带的回调。
可能原因
该问题属于flutter_osm_plugin的已知版本bug,部分版本中trackMyPosition的持续位置监听逻辑未正确绑定到onLocationChanged回调,仅在初始化阶段触发一次。
解决方案
方案1:通过插件控制器手动监听位置流
放弃使用组件的onLocationChanged回调,改用OSMController提供的位置流实现持续监听:
- 确保控制器已初始化:
final OSMController controller = OSMController();
- 在组件初始化后启用位置跟踪并监听流:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { // 启用位置跟踪 await controller.enableLocationTracking(); // 监听位置变化流 controller.locationStream.listen((GeoPoint position) { setState(() { _counter++; // 这里执行你的数据库查询逻辑 }); }); }); }
- OSMFlutter组件保留
trackMyPosition: true以显示用户标记,移除原onLocationChanged参数。
方案2:使用独立定位插件替代
不依赖flutter_osm_plugin的定位逻辑,用geolocator插件单独监听位置变化,同时保持osm插件的地图标记更新:
- 添加geolocator依赖到pubspec.yaml:
dependencies: geolocator: ^10.1.0
- 初始化位置监听:
@override void initState() { super.initState(); // 请求定位权限(如果未授权) Geolocator.requestPermission(); // 监听位置变化,设置距离过滤(超过10米触发) Geolocator.getPositionStream( locationSettings: const LocationSettings( accuracy: LocationAccuracy.high, distanceFilter: 10, ), ).listen((Position position) { setState(() { _counter++; // 执行数据库查询逻辑 // 可选:手动更新osm地图的用户位置(若需要) controller.changeLocation(GeoPoint(latitude: position.latitude, longitude: position.longitude)); }); }); }
- OSMFlutter组件仍保留
trackMyPosition: true,确保地图上的用户标记自动更新。
验证说明
两种方案均可实现“位置变化时触发自定义逻辑”的需求,方案1更贴合osm插件生态,方案2则更灵活,不受插件版本bug影响。
内容的提问来源于stack exchange,提问作者Luca Tedeschini
相关产品推荐
相关产品推荐

