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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:43:12