更改标记后,Flutter Google map 不会重新加载

标签 flutter dart google-maps-markers

我正在使用谷歌地图小部件,当我第一次使用静态标记渲染 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中您使用clearaddAll 清空它并向集合中添加新项目。但是,当您这样做时,_markers 的值不会改变,因此不会触发重建。

发生这种情况是因为 _markers 持有对 Set引用(如列表、对象等)。

您需要为_markers分配一个新值来触发重建,例如:

setState(() {
  _markers = markersToShow.toSet();
});

这实际上会更改 _markers 中保存的引用。

关于更改标记后,Flutter Google map 不会重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71517078/

相关文章:

flutter - 保存下拉按钮和文本字段选择的数据到列表中

flutter - 在 flutter 中自定义 agora 视频通话 UI

flutter - 如何在 Flutter 中使用 GridView 创建不同大小的单元格?

dart - flutter 构造函数错误

dart - Flutter:获取文档快照

javascript - 如何在谷歌地图中隐藏和显示 MarkerClusterer

gradle - JetifyTransform Flutter 运行执行失败

android - 如何在 flutter 中创建自定义步进器?

javascript - 如何在谷歌地图API中创建多个信息窗口

javascript - 谷歌街景位置