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

Jetpack Compose 集成 Google Maps 抛出 IllegalStateException 问题求助

问题原因及解决方案

1. 核心错误:MapView生命周期事件映射错误(直接触发IllegalStateException)

你编写的rememberMapLifecycleObserver方法中,生命周期事件和MapView的回调方法映射完全错误,且存在多余的异常抛出逻辑:

  • 漏写Lifecycle.Event.ON_CREATE对应mapView.onCreate()的调用
  • 错误将ON_CREATE事件对应mapView.onStart(),且没有处理Lifecycle.Event.ON_START事件,当生命周期走到ON_START阶段时,就会触发else分支的异常抛出
  • 多余对未匹配的生命周期事件抛异常,生命周期存在多个不需要MapView处理的事件,不需要抛出异常

修正后的rememberMapLifecycleObserver代码如下:

private fun rememberMapLifecycleObserver(mapView: MapView): LifecycleEventObserver =
    LifecycleEventObserver { _, event ->
        when (event) {
            Lifecycle.Event.ON_CREATE -> mapView.onCreate(Bundle())
            Lifecycle.Event.ON_START -> mapView.onStart()
            Lifecycle.Event.ON_RESUME -> mapView.onResume()
            Lifecycle.Event.ON_PAUSE -> mapView.onPause()
            Lifecycle.Event.ON_STOP -> mapView.onStop()
            Lifecycle.Event.ON_DESTROY -> mapView.onDestroy()
            Lifecycle.Event.ON_LOW_MEMORY -> mapView.onLowMemory()
            else -> {}
        }
    }

2. 额外配置检查项

如果修正上述代码后仍有问题,检查以下配置:

  • 确认AndroidManifest.xml的<application>标签内正确配置了GCP的API Key:
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="你的GCP地图API Key" />
  • 确认GCP控制台已经开启Google Maps Android SDK服务,未开启的服务会导致API Key无效
  • 确认清单文件添加了必需权限:
<uses-permission android:name="android.permission.INTERNET" />
<!-- 如需定位功能添加以下权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

3. 可选优化

你在LaunchedEffect和AndroidView回调中重复调用map.awaitMap(),可以将获取到的GoogleMap实例缓存到remember中,避免重复调用:

@Composable
fun MapViewContainer(map: MapView) {
    val cameraPosition = remember { LatLng(48.2050491798, 16.3701485194) }
    var googleMap by remember { mutableStateOf<GoogleMap?>(null) }
    
    LaunchedEffect(map) {
        googleMap = map.awaitMap()
        googleMap?.addMarker { position(cameraPosition) }
        googleMap?.moveCamera(CameraUpdateFactory.newLatLng(cameraPosition))
    }

    var zoom by rememberSaveable(map) { mutableStateOf(InitialZoom) }
    ZoomControls(zoom) {
        zoom = it.coerceIn(MinZoom, MaxZoom)
    }

    LaunchedEffect(zoom) {
        googleMap?.apply {
            setZoom(zoom)
            moveCamera(CameraUpdateFactory.newLatLng(cameraPosition))
        }
    }

    AndroidView(factory = { map })
}

内容的提问来源于stack exchange,提问作者Chris Pi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:03