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

Jetpack Compose中Google Maps Marker点击事件失效问题求助

问题描述

使用Google Maps Compose库实现Marker点击功能时无响应,代码如下:

@Composable
fun MapContent(city: City)  {
    val pos = LatLng(city.latitude, city.longitude)
    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(pos, 12f)
    }
    val mapState = rememberMarkerState(position = pos)
    
    GoogleMap(
        modifier = Modifier.fillMaxSize(),
        cameraPositionState = cameraPositionState,
        uiSettings = MapUiSettings(zoomControlsEnabled = false)
    ) {
        Marker(
            state = mapState,
            onClick = {
                Timber.tag("GoogleMapClick").d("click!!!")
                false
            }
        )
    }
}

依赖版本:

implementation 'com.google.maps.android:maps-compose:2.5.3'
implementation 'com.google.android.gms:play-services-maps:18.1.0'

期望点击Marker后显示包含城市信息的BottomSheet,请问问题出在哪里?


解决方案

1. 修正Marker点击事件的返回值

你当前在onClick中返回false,这会将点击事件传递给GoogleMap本身,导致Marker的点击回调无法正常触发。需要将返回值改为true,表示消费该点击事件,不再向下传递:

Marker(
    state = mapState,
    onClick = {
        Timber.tag("GoogleMapClick").d("click!!!")
        true // 改为true,消费点击事件
    }
)

2. 升级依赖版本确保兼容性

当前使用的play-services-maps:18.1.0版本与maps-compose:2.5.3存在兼容性问题,建议将play-services-maps升级到18.2.0或更高版本,匹配Maps Compose的版本要求:

implementation 'com.google.maps.android:maps-compose:2.5.3'
implementation 'com.google.android.gms:play-services-maps:18.2.0'

3. 实现点击Marker显示BottomSheet

添加状态变量控制BottomSheet的显示/隐藏,点击Marker时更新状态,结合ModalBottomSheetLayout实现需求:

@Composable
fun MapContent(city: City)  {
    val pos = LatLng(city.latitude, city.longitude)
    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(pos, 12f)
    }
    val mapState = rememberMarkerState(position = pos)
    val showBottomSheet = remember { mutableStateOf(false) } // 控制BottomSheet显示的状态

    ModalBottomSheetLayout(
        sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true),
        sheetContent = {
            // 这里放置城市信息的BottomSheet内容
            Column(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(16.dp)
            ) {
                Text(text = "城市:${city.name}", fontSize = 18.sp, fontWeight = FontWeight.Bold)
                Text(text = "纬度:${city.latitude}", fontSize = 14.sp)
                Text(text = "经度:${city.longitude}", fontSize = 14.sp)
                // 可添加更多信息或操作按钮
            }
        },
        sheetBackgroundColor = Color.White,
        sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
        content = {
            GoogleMap(
                modifier = Modifier.fillMaxSize(),
                cameraPositionState = cameraPositionState,
                uiSettings = MapUiSettings(zoomControlsEnabled = false)
            ) {
                Marker(
                    state = mapState,
                    onClick = {
                        showBottomSheet.value = true // 点击Marker显示BottomSheet
                        true
                    }
                )
            }
        }
    )
}

额外检查

  • 确保没有其他布局(如悬浮按钮、遮罩层)覆盖在Marker上方,阻挡点击事件。
  • 确认City类的latitude和longitude值正确,Marker确实显示在地图上的可点击位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:01:01