如何将flutter_map 3.0.0代码升级适配至7.0.2版本?
适配后的完整代码
import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; class FlutterMapZoomButtons extends StatelessWidget { final double minZoom; final double maxZoom; final bool mini; final double padding; final Alignment alignment; final Color? zoomInColor; final Color? zoomInIconColor; final Color? zoomOutColor; final Color? zoomOutIconColor; final IconData zoomInIcon; final IconData zoomOutIcon; const FlutterMapZoomButtons({ super.key, this.minZoom = 1, this.maxZoom = 18, this.mini = true, this.padding = 2.0, this.alignment = Alignment.topRight, this.zoomInColor, this.zoomInIconColor, this.zoomInIcon = Icons.zoom_in, this.zoomOutColor, this.zoomOutIconColor, this.zoomOutIcon = Icons.zoom_out, }); @override Widget build(BuildContext context) { final mapController = FlutterMap.maybeOf(context)?.controller; return Align( alignment: alignment, child: Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Padding( padding: EdgeInsets.only(left: padding, top: padding, right: padding), child: FloatingActionButton( heroTag: 'zoomInButton', mini: mini, backgroundColor: zoomInColor ?? Colors.white.withOpacity(0.8), onPressed: mapController == null ? null : () { final newZoom = mapController.zoom + 1; mapController.move( mapController.camera.center, newZoom.clamp(minZoom, maxZoom), source: MapEventSource.custom, ); }, child: Icon( zoomInIcon, color: zoomInIconColor ?? IconTheme.of(context).color, ), ), ), Padding( padding: EdgeInsets.all(padding), child: FloatingActionButton( heroTag: 'zoomOutButton', mini: mini, backgroundColor: zoomOutColor ?? Colors.white.withOpacity(0.8), onPressed: mapController == null ? null : () { final newZoom = mapController.zoom - 1; mapController.move( mapController.camera.center, newZoom.clamp(minZoom, maxZoom), source: MapEventSource.custom, ); }, child: Icon( zoomOutIcon, color: zoomOutIconColor ?? IconTheme.of(context).color, ), ), ), ], ), ); } }
关键改动说明
- 状态获取方式变更:7.x版本移除了
FlutterMapState.maybeOf,改为通过FlutterMap.maybeOf(context)?.controller获取MapController,这是当前地图状态的核心管理类 - 简化缩放逻辑:原代码中通过
bounds计算centerZoom的逻辑冗余,直接使用mapController.zoom和mapController.camera.center即可完成缩放操作,更高效 - 空安全优化:移除强制解包
map!,通过空判断禁用按钮(当未找到MapController时),避免运行时空指针异常 - 参数命名修正:将
zoomInColorIcon/zoomOutColorIcon修正为更符合规范的zoomInIconColor/zoomOutIconColor - 依赖导入调整:确保导入最新的
flutter_map/flutter_map.dart而非旧的plugin_api.dart,7.x已统一入口
内容的提问来源于stack exchange,提问作者Pistis
相关产品推荐
相关产品推荐

