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

Jetpack Compose地图聚类偶现默认标记与自定义标记共存问题

解决Google Maps Compose聚类组件随机显示默认标记的问题

我开发的带自定义标记聚类的地图页面,功能正常但存在随机异常:打开页面后同一位置会同时显示自定义标记和Google默认标记,触发时机不确定——有时首次打开就出现,有时多次打开后才会触发。

可能的原因及解决方案

1. 检查ClusterItem实现是否正确

MapTenant作为聚类项必须正确实现ClusterItem接口,否则组件可能无法识别自定义标记,回退显示默认样式。确保覆盖所有必要方法:

data class MapTenant(
    private val itemPosition: LatLng,
    private val itemTitle: String,
    private val itemSnippet: String,
    val itemZIndex: Float,
    val item: Game
) : ClusterItem {
    override fun getPosition(): LatLng = itemPosition
    override fun getTitle(): String? = itemTitle
    override fun getSnippet(): String? = itemSnippet
    override fun getZIndex(): Float = itemZIndex
}

2. 稳定化聚类项列表,避免不必要重组

每次重组时重新生成items列表会导致聚类组件重复创建标记,旧的默认标记可能未被及时清理。用remember缓存列表,仅在数据源变化时更新:

// 在MapScreen中修改items生成逻辑
val items = remember(stepResult.games) {
    games.map {
        MapTenant(
            itemPosition = LatLng(it.latLng.latitude, it.latLng.longitude),
            itemTitle = it.name,
            itemSnippet = it.address,
            itemZIndex = 0f,
            item = it
        )
    }
}

3. 升级Maps Compose依赖版本

旧版本的maps-compose可能存在Experimental API的内部状态管理bug,导致标记渲染异常。将依赖升级到最新稳定版:

dependencies {
    implementation "com.google.maps.android:maps-compose:2.11.4" // 替换为最新版本
}

4. 确保聚类组件输入稳定

检查CustomUiClustering的输入参数,确保items、onMapSelected、onItemSelected都是稳定的。比如用remember包装回调,避免每次重组生成新的lambda:

@OptIn(MapsComposeExperimentalApi::class)
@Composable
private fun CustomUiClustering(
    items: List<MapTenant>,
    onMapSelected: (List<MapTenant>) -> Unit,
    onItemSelected: (MapTenant) -> Unit
) {
    val stableOnClusterClick = remember(onMapSelected) {
        { cluster: Cluster<MapTenant> ->
            onMapSelected(cluster.items.toList())
            false
        }
    }
    val stableOnClusterItemClick = remember(onItemSelected) {
        { item: MapTenant ->
            onItemSelected(item)
            true
        }
    }

    Clustering(
        items = items,
        onClusterClick = stableOnClusterClick,
        onClusterItemClick = stableOnClusterItemClick,
        clusterContent = { cluster ->
            CircleContent(
                modifier = Modifier.size(40.dp),
                text = "%,d".format(cluster.size),
            )
        },
        clusterItemContent = {
            CircleContent(
                modifier = Modifier.size(20.dp),
                text = "",
            )
        }
    )
}

总结

这类随机异常大多和Compose的重组机制、组件状态稳定性或依赖版本bug有关。优先排查ClusterItem实现和列表稳定性,再尝试升级依赖,基本能解决问题。

内容的提问来源于stack exchange,提问作者Aris Guimerá

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:34:52