Flutter中Google Maps按钮点击函数异常触发问题求助
解决Google Maps中Marker自动重复添加的问题
嘿,我帮你找到了问题的根源,其实都是同一个小疏忽导致的,咱们来快速修复它!
问题核心原因
你的两个困扰——页面加载时自动添加Marker、地图移动时不断新增Marker,本质上是同一个错误:按钮的onPressed参数传递方式错了
在你的代码里,RoundedButton的onPressed写的是:
onPressed: _onAddMarkerButtonPressed()
这种写法会在build方法执行时立即调用_onAddMarkerButtonPressed函数,而不是把它作为点击回调函数传递。这就导致:
- 屏幕首次加载时,
build执行,直接触发函数添加Marker; - 当地图移动调用
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
相关产品推荐
相关产品推荐

