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

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提供的位置流实现持续监听:

  1. 确保控制器已初始化:
final OSMController controller = OSMController();
  1. 在组件初始化后启用位置跟踪并监听流:
@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) async {
    // 启用位置跟踪
    await controller.enableLocationTracking();
    // 监听位置变化流
    controller.locationStream.listen((GeoPoint position) {
      setState(() {
        _counter++;
        // 这里执行你的数据库查询逻辑
      });
    });
  });
}
  1. OSMFlutter组件保留trackMyPosition: true以显示用户标记,移除原onLocationChanged参数。

方案2:使用独立定位插件替代

不依赖flutter_osm_plugin的定位逻辑,用geolocator插件单独监听位置变化,同时保持osm插件的地图标记更新:

  1. 添加geolocator依赖到pubspec.yaml:
dependencies:
  geolocator: ^10.1.0
  1. 初始化位置监听:
@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));
    });
  });
}
  1. OSMFlutter组件仍保留trackMyPosition: true,确保地图上的用户标记自动更新。

验证说明

两种方案均可实现“位置变化时触发自定义逻辑”的需求,方案1更贴合osm插件生态,方案2则更灵活,不受插件版本bug影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:30:08