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

Flutter 如何实现用户点击(onTap)marker时更改其颜色

Flutter 点击Marker动态修改颜色的实现方案

以下方案基于Flutter主流地图插件google_maps_flutter编写,其他地图SDK(高德、百度地图Flutter版)逻辑通用:

核心思路

Marker实例本身是不可变类型,无法直接修改属性值,因此需要在State中维护Marker集合的状态,点击Marker时通过创建新的Marker副本替换原有实例,再调用setState触发重绘即可完成颜色修改。

具体实现步骤

  • 第一步:定义状态变量
    在页面State类中维护Marker集合和当前选中的MarkerID:
// 存储地图上所有标记
Set<Marker> _markers = {};
// 记录当前被选中的标记ID,用于恢复之前选中标记的颜色
MarkerId? _selectedMarkerId;
  • 第二步:初始化Marker并绑定点击回调
    初始化Marker时给每个实例配置onTap回调,传入当前Marker的唯一ID:
@override
void initState() {
  super.initState();
  _initMarkers();
}
void _initMarkers() {
  const marker1Id = MarkerId('location_1');
  const marker2Id = MarkerId('location_2');
  _markers.addAll([
    Marker(
      markerId: marker1Id,
      position: const LatLng(39.9042, 116.4074), // 北京坐标示例
      // 默认使用红色Marker
      icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed),
      onTap: () => _onMarkerTapped(marker1Id),
    ),
    Marker(
      markerId: marker2Id,
      position: const LatLng(31.2304, 121.4737), // 上海坐标示例
      icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed),
      onTap: () => _onMarkerTapped(marker2Id),
    ),
  ]);
}
  • 第三步:实现点击修改颜色的逻辑
void _onMarkerTapped(MarkerId tappedId) {
  // 先将之前选中的Marker恢复为默认红色
  if (_selectedMarkerId != null) {
    final oldMarker = _markers.firstWhere((m) => m.markerId == _selectedMarkerId);
    final resetOldMarker = oldMarker.copyWith(
      iconParam: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed),
    );
    _markers.remove(oldMarker);
    _markers.add(resetOldMarker);
  }
  // 将当前点击的Marker修改为蓝色(可自定义其他颜色值)
  final currentMarker = _markers.firstWhere((m) => m.markerId == tappedId);
  final newMarker = currentMarker.copyWith(
    iconParam: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueBlue),
  );
  _markers.remove(currentMarker);
  _markers.add(newMarker);
  // 更新选中ID,触发重绘
  _selectedMarkerId = tappedId;
  setState(() {});
}
  • 第四步:将Marker集合传入地图组件
@override
Widget build(BuildContext context) {
  return Scaffold(
    body: GoogleMap(
      initialCameraPosition: const CameraPosition(
        target: LatLng(39.9042, 116.4074),
        zoom: 10,
      ),
      markers: _markers,
    ),
  );
}

补充说明

如果使用自定义Marker图标,只需将BitmapDescriptor.defaultMarkerWithHue替换为对应颜色的自定义图标资源即可,逻辑无需修改。

内容的提问来源于stack exchange,提问作者menote nhanga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:18:03