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

Flutter跨页面添加Google Map Marker后地图UI不实时刷新的问题

问题:添加Marker后GoogleMap主页面UI不自动刷新

主页面通过GoogleMap组件展示Marker,从第三页面添加Marker后,Marker列表已更新,但返回主页面后新Marker不显示,仅移动地图时才会出现。需要实现添加后直接显示新Marker。

原因分析

MarkerList已经继承ChangeNotifier并在添加Marker时调用notifyListeners(),但主页面的State没有监听这个变化,导致build方法不会自动重新执行——只有onCameraMove触发setState()时,才会刷新UI并读取更新后的Marker列表。

解决方案

在主页面的State中监听MarkerList的变化,当收到更新通知时主动调用setState()刷新UI,同时在页面销毁时移除监听器避免内存泄漏。

修改后主页面代码

class _MyHomePageState extends State<MyHomePage> {
  late GoogleMapController mapController;
  MarkerList markersList = MarkerList();
  late VoidCallback _markerUpdateListener;

  @override
  void initState() {
    super.initState();
    // 注册监听器:MarkerList更新时触发UI刷新
    _markerUpdateListener = () {
      setState(() {});
    };
    markersList.addListener(_markerUpdateListener);
  }

  @override
  void dispose() {
    // 移除监听器,防止内存泄漏
    markersList.removeListener(_markerUpdateListener);
    super.dispose();
  }

  // 以下原有代码保持不变
  Route _createRouteToSecondScreen(MarkerList markerList) {
    return PageRouteBuilder(
      opaque: false,
      pageBuilder: (context, animation, secondaryAnimation) => SecondScreen(
        centerMove: LatLng(-33.865143, 151.209900),
        markerList: markerList,
      ),
    );
  }

  Future<void> _onMapCreated(GoogleMapController controller) async {
    mapController = controller;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GoogleMap(
        markers: Set<Marker>.of(markersList.markers),
        mapType: MapType.hybrid,
        myLocationButtonEnabled: false,
        myLocationEnabled: true,
        compassEnabled: false,
        onMapCreated: _onMapCreated,
        onCameraMove: (CameraPosition cp) {
          setState(() {});
        },
        initialCameraPosition: const CameraPosition(
          target: LatLng(0, 0),
          zoom: 2,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(_createRouteToSecondScreen(markersList));
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}

说明

  • 当第三页面调用markersList.addMarker()时,MarkerList会调用notifyListeners(),主页面的监听器收到通知后执行setState(),触发build方法重新执行,GoogleMap会读取更新后的Marker列表并显示新添加的Marker。
  • 必须在dispose中移除监听器,避免页面销毁后仍持有引用导致内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:47:50