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

Flutter中Google Maps按钮点击函数异常触发问题求助

解决Google Maps中Marker自动重复添加的问题

嘿,我帮你找到了问题的根源,其实都是同一个小疏忽导致的,咱们来快速修复它!

问题核心原因

你的两个困扰——页面加载时自动添加Marker、地图移动时不断新增Marker,本质上是同一个错误:按钮的onPressed参数传递方式错了

在你的代码里,RoundedButton的onPressed写的是:

onPressed: _onAddMarkerButtonPressed()

这种写法会在build方法执行时立即调用_onAddMarkerButtonPressed函数,而不是把它作为点击回调函数传递。这就导致:

  1. 屏幕首次加载时,build执行,直接触发函数添加Marker;
  2. 当地图移动调用setState更新地址时,build会重新执行,又会再次调用这个函数,Marker就会不断增多。

修复方案

只需要把onPressed的参数改成函数引用(去掉括号),这样它只会在按钮被点击时才会执行:

Positioned(
  bottom: 24.0 - (42/2),
  right: (mapWidth - 150)/ 2,
  // 关键修复:去掉括号,传递函数引用而非立即调用
  child: RoundedButton(title: 'Add Alert', color: Colors.lightBlueAccent, onPressed: _onAddMarkerButtonPressed),
),

完整修复后的关键代码片段

class _MyHomePageState extends State<MyHomePage> {
  Completer<GoogleMapController> _controller = Completer();
  static const LatLng _center = const LatLng(-31.950260, 115.851840);
  final Set<Marker> _markers = {};
  LatLng _lastMapPosition = _center;
  String address = ""; // 记得补充声明address变量,原代码里遗漏了

  @override
  Widget build(BuildContext context) {
    double mapWidth = MediaQuery.of(context).size.width;
    double mapHeight = MediaQuery.of(context).size.height - 215;
    double iconSize = 30.0;
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Stack(
        alignment: Alignment(0.0, 0.0),
        children: <Widget>[
          // ... GoogleMap组件保持不变 ...
          // 修复后的添加Marker按钮
          Positioned(
            bottom: 24.0 - (42/2),
            right: (mapWidth - 150)/ 2,
            child: RoundedButton(title: 'Add Alert', color: Colors.lightBlueAccent, onPressed: _onAddMarkerButtonPressed),
          ),
          // ... 其他组件保持不变 ...
        ],
      ),
    );
  }

  // ... _onAddMarkerButtonPressed和_onCameraMove函数逻辑保持不变 ...
}

额外提醒:原代码里没有声明address变量,记得在_MyHomePageState里补充String address = "";,否则会出现未定义的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:41:22