我正在使用谷歌地图小部件,当我第一次使用静态标记渲染 map 时,它会显示所有标记,但是当我从 API 获取数据并尝试向 map 添加新标记时,它会显示所有标记。不会显示它们。
下面是我正在使用的代码:
class Map extends StatefulWidget {
final Position initialPosition;
final List<Marker> allSitesMarkers;
final List<Site> placesSite;
final List<String> mapMarkersCategories;
const Map(this.initialPosition, this.allSitesMarkers, this.placesSite,
this.mapMarkersCategories,
{Key key})
: super(key: key);
@override
State<StatefulWidget> createState() => MapState();
}
class MapState extends State<Map> {
Completer<GoogleMapController> _controller = Completer();
String currentCategoryFilter;
bool filtred = false;
Set<Marker> _markers = Set();
List<Marker> markersToShow;
@override
void initState() {
super.initState();
refreshMarkers();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: (widget.placesSite.isNotEmpty)
? Stack(
children: [
GoogleMap(
initialCameraPosition: const CameraPosition(
target: LatLng(36.798, 10.1717), zoom: 15),
mapType: MapType.normal,
myLocationEnabled: true,
markers: _markers,
onMapCreated: (GoogleMapController controller) {
controller.setMapStyle(
'[ //... ]');
_controller.complete(controller);
},
),
_chips()
],
)
: const NoListMap(),
);
}
Widget _chips() {
//..
}
filterSites(String category) {
setState(() {
_markers.clear();
filtred = true;
markersToShow = widget.allSitesMarkers
.where((element) => element.infoWindow.title == category)
.toList();
});
refreshMarkers();
}
refreshMarkers() {
if (filtred) {
setState(() {
_markers.clear();
_markers.addAll(markersToShow);
});
} else {
setState(() {
_markers.clear();
_markers.addAll(widget.allSitesMarkers);
});
}
}
}
我正在使用:
flutter 2.10.2
Dart 2.16.1
google_maps_flutter:2.0.9
最佳答案
您的_markers
是一个Set
,在setState
中您使用clear
和addAll
清空它并向集合中添加新项目。但是,当您这样做时,_markers
的值不会改变,因此不会触发重建。
发生这种情况是因为 _markers
持有对 Set
的引用(如列表、对象等)。
您需要为_markers
分配一个新值来触发重建,例如:
setState(() {
_markers = markersToShow.toSet();
});
这实际上会更改 _markers
中保存的引用。
关于更改标记后,Flutter Google map 不会重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71517078/