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

使用ComposeView替代原生View实现地图标记信息窗口时遇WindowRecomposer定位失败问题求助

解决Compose Maps Library自定义InfoWindow的windowRecomposer错误

我之前在做类似功能时也碰到过这个问题,核心原因是Google Maps的InfoWindow创建时机和Compose的View初始化逻辑不兼容:当getInfoWindow()返回ComposeView时,这个View还没有被添加到Android的窗口层级里,而Compose必须依赖windowRecomposer来启动UI重组,这就直接导致了那串报错。

下面是经过验证的解决方法,核心思路是延迟Compose内容的设置,直到ComposeView被成功附加到窗口之后:

clusterManager?.markerCollection?.setInfoWindowAdapter(object : InfoWindowAdapter {
    override fun getInfoContents(p0: Marker): View? {
        return null
    }

    override fun getInfoWindow(marker: Marker): View {
        val composeView = ComposeView(context).apply {
            // 先不设置Compose内容,等View被attach到窗口后再处理
            addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
                override fun onViewAttachedToWindow(v: View) {
                    // 此时View已经拥有有效的windowRecomposer,可以安全初始化Compose内容
                    (v as ComposeView).setContent {
                        // 这里替换成你的自定义Compose布局
                        Card(
                            modifier = Modifier.fillMaxWidth().padding(16.dp),
                            elevation = 8.dp,
                            shape = RoundedCornerShape(8.dp)
                        ) {
                            Column(modifier = Modifier.padding(16.dp)) {
                                Text(
                                    text = marker.title ?: "无标题",
                                    fontWeight = FontWeight.Bold,
                                    fontSize = 16.sp
                                )
                                Spacer(modifier = Modifier.height(8.dp))
                                Text(text = marker.snippet ?: "无描述", fontSize = 14.sp)
                            }
                        }
                    }
                    // 完成后移除监听,避免重复触发
                    v.removeOnAttachStateChangeListener(this)
                }

                override fun onViewDetachedFromWindow(v: View) {
                    // 可选:在这里清理Compose相关资源
                }
            })
        }
        return composeView
    }
})

额外注意事项

  1. InfoWindow的静态特性:Google Maps的InfoWindow本质是一张静态Bitmap快照,所以如果你的Compose内容包含点击事件、动画等动态交互,这些功能不会生效。如果需要交互性,建议监听Marker的点击事件,自己弹出一个Compose Dialog或者BottomSheet来替代原生InfoWindow。
  2. 状态管理:如果需要展示的内容依赖动态数据,可以配合ViewModel来管理状态,确保Compose内容能正确响应数据变化。
  3. 性能优化:如果有大量Marker,建议考虑缓存ComposeView实例,避免频繁创建和销毁View带来的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:32:47