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

如何将flutter_map 3.0.0代码升级适配至7.0.2版本?

Flutter Map 3.0.0 升级至7.0.2:自定义ZoomButtons组件适配方案

适配后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:12:23