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

Jetpack Compose中Google Map聚类后Marker点击弹窗功能失效求助

解决Google Map聚类后Marker点击失效的问题

你的问题出在同时使用了ClusterManager添加标记和手动渲染Marker组件,两者会产生冲突,导致手动写的Marker点击事件被覆盖。下面是具体的修复步骤和代码:

核心修复思路

  • 移除手动循环添加的Marker组件,所有标记由ClusterManager统一管理
  • 给ClusterManager设置标记点击监听器,处理信息窗口的显示逻辑
  • 让ClusterManager接管地图的相机和标记点击事件,确保聚类和点击功能协同工作

修改后的完整代码

GoogleMap(
    modifier = Modifier.fillMaxSize(),
    cameraPositionState = cameraPositionState,
    uiSettings = uiSettings,
    onMapClick = { onMapClick(it) }
) {
    var clusterManager by remember {
        mutableStateOf<ClusterManager<CustomMarkerState>?>(null)
    }

    MapEffect(listOfMarkers) { map ->
        if (clusterManager == null) {
            clusterManager = ClusterManager<CustomMarkerState>(context, map)
            
            // 设置单个标记的点击监听器
            clusterManager?.setOnClusterItemClickListener { marker ->
                isShown = true
                selectedMarker = marker
                true // 返回true表示消费该点击事件
            }
            
            // 让ClusterManager接管地图的相机和点击事件
            map.setOnCameraIdleListener(clusterManager)
            map.setOnMarkerClickListener(clusterManager)
        }
        
        // 先清空旧标记,再添加新的,避免重复
        clusterManager?.clearItems()
        clusterManager?.addItems(listOfMarkers)
        clusterManager?.cluster() // 手动触发一次聚类
    }

    LaunchedEffect(key1 = cameraPositionState.isMoving) {
        if (!cameraPositionState.isMoving) {
            clusterManager?.onCameraIdle()
        }
    }
}

额外说明

  • 如果你需要自定义标记样式,不要手动写Marker,而是给ClusterManager设置自定义的ClusterRenderer
  • 调用clearItems()再添加新标记,是为了避免列表更新时重复添加标记
  • cluster()方法可以在添加完标记后立即触发聚类,不用等相机空闲

内容的提问来源于stack exchange,提问作者Hocine Elhadj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:25:21