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

Flutter Google Map传入标记列表仅显示单个Marker问题求助

问题根因

  • MarkerId重复:你当前使用线路ID buses[i]!.bus.route.routeId 作为Marker的唯一标识,若多辆巴士属于同一条线路,会出现重复ID。Google Map接收的是Set类型的Marker集合,相同markerId的Marker会被Set自动去重,所以即便你的markers Map长度显示为2,转成Set后只剩1个元素,最终仅显示1个Marker。
  • CircleId重复:所有Circle的ID写死为固定字符串"car",同样会触发覆盖逻辑,仅保留最后1个Circle。
  • 冗余重绘:updateMarkerAndCircle方法循环内部多次调用setState,会触发多次不必要的页面刷新,影响性能。

修复方案

修改updateMarkerAndCircle方法,使用巴士ID作为Marker和Circle的唯一标识,同时移除循环内的冗余setState调用:

void updateMarkerAndCircle(Map<int, LocationModel> buses) {
  // 先批量更新所有marker和circle
  for (int i in buses.keys) {
    LatLng latlng = LatLng(buses[i]!.lat, buses[i]!.lon);
    Marker marker = Marker(
        // 改用巴士ID作为唯一标识,保证不会重复
        markerId: MarkerId(i.toString()),
        position: latlng,
        rotation: buses[i]!.heading,
        draggable: false,
        zIndex: 2,
        flat: true,
        anchor: const Offset(0.5, 0.5),
        icon: BitmapDescriptor.defaultMarkerWithHue(
            BitmapDescriptor.hueBlue));
    Circle circle = Circle(
        // 同样用巴士ID作为Circle的唯一标识
        circleId: CircleId(i.toString()),
        radius: buses[i]!.accuracy,
        zIndex: 1,
        strokeColor: Colors.blue,
        center: latlng,
        fillColor: Colors.blue.withAlpha(70));

    markers[i] = marker;
    circles[i] = circle;
  }
  // 批量更新完成后统一触发一次重绘
  setState(() {});
}

同时可以移除subscribeToStream方法中包裹updateMarkerAndCircle的外层setState,避免重复调用。

内容的提问来源于stack exchange,提问作者Indusara Umayanga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:45:03