Compose地图rememberMarkerState异常:标记有时无法渲染问题排查
我们使用Jetpack Compose开发应用,地图及标记功能基于Google Maps Compose 5.0.1版本实现。地图移动停止后,会向服务器请求标记列表,转换为UI模型后通过以下代码绘制标记:
GoogleMap( modifier = modifier, cameraPositionState = cameraPositionState, properties = mapProperties, uiSettings = uiSettings, onMapClick = { onMapClick() }, onMapLoaded = { onMapLoaded( LocationLatLng( cameraPositionState.position.target.latitude, cameraPositionState.position.target.longitude ), cameraPositionState.visibleAreaAsRadius(defaultVisibleAreaDistance) ) } ) { markers?.forEach { marker -> MarkerComposable( state = rememberMarkerState( key = marker.key, position = LatLng( marker.position.latitude, marker.position.longitude ), ), onClick = { marker.onMarkerClick() return@MarkerComposable false } ) { Image( modifier = Modifier.size(64.dp), painter = painterResource(marker.iconResId), contentDescription = marker.contentDescriptionResId?.let { stringResource(it) }, ) } } }
但发现部分场景下,即便标记已存在于列表中,地图上也无法显示。已知标记的key是唯一的,预期地图移动后标记能正常渲染,但实际进入rememberMarkerState后标记不出现,且未触发重组。
可能的解决方向:
确保
markers是可观察状态
如果markers是普通变量而非Compose可感知的State(比如MutableStateList或StateFlow转换的State),Compose无法检测到列表变化,不会触发重组。需用状态容器持有标记列表:// 示例:用MutableStateList持有 val markers = remember { mutableStateListOf<MarkerUiModel>() } // 或从ViewModel的StateFlow收集 val markers by viewModel.markersFlow.collectAsStateWithLifecycle()验证
rememberMarkerState的key有效性
确保marker.key是稳定可哈希的类型(如String、Int),避免使用未重写equals/hashCode的自定义对象。同时确认每次列表更新时,marker.key未意外变更,导致状态无法正确关联。联动相机状态触发重组
Google Maps Compose可能对可视区域外的标记做了渲染优化,可监听相机移动结束事件,主动触发标记列表的状态更新:LaunchedEffect(cameraPositionState.isMoving) { if (!cameraPositionState.isMoving) { viewModel.fetchMarkers(/* 传入当前相机参数 */) } }升级依赖版本
5.0.1版本可能存在已知的标记渲染bug,尝试升级到较新的稳定版本(如6.x系列),官方可能已修复此类重组或渲染问题。排查自定义Marker内容
临时替换Image为简单可渲染组件(如带颜色的Box),确认是否是资源加载或内容布局导致的渲染失败:MarkerComposable(...) { Box(modifier = Modifier.size(64.dp).background(Color.Red)) }
内容的提问来源于stack exchange,提问作者fevziomurtekin

