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

如何在Flutter Web的谷歌地图Marker上添加onHover悬停事件?

解决方案

目前google_maps_flutter_web官方未直接暴露Marker的悬停回调接口,可通过以下两种方案实现需求:

方案1:Web端绑定原生Google Maps事件(推荐,web场景最优)

google_maps_flutter_web本质是对Google Maps原生JS API的封装,你可以直接拿到Marker对应的原生JS实例,绑定mouseover、mouseout事件即可,触发时机和原生光标变化完全一致,无误差。
示例代码:

import 'package:flutter/foundation.dart';
import 'dart:js_util' as js_util;
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';

// 定义Marker
final Marker customMarker = Marker(
  markerId: const MarkerId('target_marker'),
  position: const LatLng(39.9042, 116.4074),
  // 其他Marker配置
);

// 地图初始化回调中绑定事件
void _onMapCreated(GoogleMapController controller) async {
  // 仅web场景执行该逻辑
  if (kIsWeb) {
    final webController = controller as GoogleMapControllerWeb;
    final nativeMarker = webController.markers[customMarker.markerId]?.webMarker;
    if (nativeMarker != null) {
      // 绑定鼠标移入悬停事件
      js_util.callMethod(nativeMarker, 'addListener', ['mouseover', () {
        // 此处写你的悬停触发逻辑
        debugPrint('Marker 进入悬停状态');
      }]);
      // 绑定鼠标移出事件
      js_util.callMethod(nativeMarker, 'addListener', ['mouseout', () {
        // 此处写你的悬停结束逻辑
        debugPrint('Marker 退出悬停状态');
      }]);
    }
  }
}

方案2:全平台兼容的坐标碰撞检测方案

如果你的项目需要做多端(Android/iOS/Web)统一逻辑,可以通过监听地图的指针悬停事件,结合Marker坐标做命中判断实现:

  • 预先存储所有Marker的位置、markerId和对应回调
  • 给GoogleMap组件添加onPointerHover回调,拿到当前指针的屏幕坐标,调用控制器的getLatLng方法将屏幕坐标转换为地图经纬度
  • 遍历所有Marker,判断当前经纬度是否在Marker预设的命中范围内(可根据Marker图标大小设置偏移阈值,常规图标建议设置为0.00001~0.00005度),命中则触发对应悬停回调

内容的提问来源于stack exchange,提问作者Pongsiri Tonsuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:45:04