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

