Flutter获取坐标后无法刷新GoogleMap的问题该如何解决?
问题根因
GoogleMap组件的initialCameraPosition属于一次性初始化参数,仅在组件首次构建挂载时生效,后续你通过setState修改_lat、_lng、_zoom变量不会触发地图相机位置更新,所以会出现变量值已更新但地图无变化的情况。
解决方法
你需要通过GoogleMapController主动操控地图更新,按以下步骤修改代码即可:
- 先在State类中声明地图控制器成员变量
GoogleMapController? _mapController;
- 给GoogleMap组件添加
onMapCreated回调,存储控制器实例
Container( width: 350, height: 350, child: GoogleMap( markers: Set<Marker>.of(_markers), mapType: MapType.satellite, // 新增onMapCreated回调 onMapCreated: (controller) => _mapController = controller, initialCameraPosition: CameraPosition(zoom: _zoom, target: LatLng(_lat, _lng))), ),
- 在
saveGps方法的setState执行完成后,调用控制器方法更新地图相机位置
void saveGps() async { DateTime now = DateTime.now(); var timezoneOffset = now.timeZoneOffset; Prefs.cityName = _cityName; Prefs.offset = timezoneOffset.inMinutes / 60; setState(() { _lat = Prefs.lat = _position.latitude; _lng = Prefs.lng = _position.longitude; _markers.clear(); _markers.add(Marker( markerId: MarkerId(Prefs.cityName), position: LatLng(Prefs.lat, Prefs.lng), infoWindow: InfoWindow( title: Prefs.cityName, ))); _zoom = 17; }); // 新增相机位置更新逻辑,做空判断避免空指针报错 if (_mapController != null) { _mapController!.moveCamera( CameraUpdate.newCameraPosition( CameraPosition(target: LatLng(_lat, _lng), zoom: _zoom), ), ); } }
补充说明
你当前的Marker更新逻辑是正确的,只要_markers是State类的成员变量,setState修改后Marker会自动同步更新到地图上,不需要额外调整。
内容的提问来源于stack exchange,提问作者Bhikkhu Subhuti
相关产品推荐
相关产品推荐

