Google Maps Compose MarkerComposable崩溃:width和height必须大于0
解决Google Maps Compose MarkerComposable触发的Bitmap创建崩溃问题
针对你遇到的java.lang.IllegalArgumentException: width and height must be > 0崩溃,结合问题场景和代码,可尝试以下几种解决方案:
1. 给Marker内容设置明确的固定尺寸
当前Marker内部的Box未指定尺寸,在部分设备或资源加载延迟的场景下,可能导致Composable测量出的宽高为0,进而触发Bitmap创建失败。给内容容器添加明确尺寸:
MarkerComposable( state = MarkerState(latLng), ) { val markerSequence = getMarkerSequence(index) // 给Box设置固定大小,确保测量时有明确尺寸 Box( modifier = Modifier.size(48.dp), contentAlignment = Alignment.Center ) { Image( painter = painterResource(id = R.drawable.ic_my_icon), contentDescription = "", modifier = Modifier.fillMaxSize() // 让图片占满容器 ) Text( text = markerSequence, color = Color.White, modifier = Modifier .padding(top = 4.dp) .align(Alignment.TopCenter) ) } }
2. 预加载Marker图片资源
使用remember预加载图片Painter,避免资源加载延迟导致的初始尺寸异常:
@Composable fun LocationMarkers( locations: List<LatLng>, getMarkerSequence: (Int) -> String ) { // 预加载图片资源 val markerPainter = remember { painterResource(id = R.drawable.ic_my_icon) } locations.onEachIndexed { index, latLng -> MarkerComposable( state = MarkerState(latLng), ) { val markerSequence = getMarkerSequence(index) Box( modifier = Modifier.size(48.dp), contentAlignment = Alignment.Center ) { Image( painter = markerPainter, contentDescription = "", modifier = Modifier.fillMaxSize() ) // ... Text部分不变 } } } }
3. 强制设置最小尺寸防护
通过Modifier.layout强制给Marker内容设置最小宽高,避免测量出0值:
Box( modifier = Modifier .size(48.dp) .layout { measurable, constraints -> // 强制设置最小宽高,防止出现0尺寸 val safeConstraints = constraints.copy( minWidth = 24.dp.roundToPx(), minHeight = 24.dp.roundToPx() ) val placeable = measurable.measure(safeConstraints) layout(placeable.width, placeable.height) { placeable.place(0, 0) } }, contentAlignment = Alignment.Center ) { // ... 图片和Text }
4. 更新Google Maps Compose库至最新稳定版
该崩溃可能是库内部的渲染逻辑bug,检查并更新依赖到最新版本(比如com.google.maps.android:maps-compose:2.11.0及以上),官方可能已修复此类边缘场景的尺寸计算问题。
5. 优化Marker渲染数量
如果locations数据量较大,一次性渲染过多Marker可能导致部分Marker的渲染上下文异常。可尝试只渲染当前地图视口内的Marker,或分批加载,减少同时渲染的Marker数量。
内容的提问来源于stack exchange,提问作者Sattar
相关产品推荐
相关产品推荐

