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
相关产品推荐
相关产品推荐

