所以我找到了解决方法,不确定这是否正确。任何 cmets 都是有价值的。
因此,根据ComposeView,只有当视图附加到窗口或显式设置父 CompositionContext 时才会发生初始组合。
信息窗口视图的工作方式是它们不将视图附加到窗口,而是从视图创建位图并显示该位图。
这在撰写地图的ComposeInfoWindowAdapter 中也有提及。
因此,按照 ComposeInfoWindowAdapter 的示例,您需要一个父视图来临时将 ComposeView 附加到窗口,并在渲染标记信息窗口后删除父视图。
我们正在使用 LocalView.current 来获取当前的 ComposeView。并通过 rememberCompositionContext 创建 CompositionContext。
完成此操作后,集群管理器的标记将支持撰写功能作为信息窗口。
val currentView = LocalView.current
val compositionContext = rememberCompositionContext()
val markerCollection = clusterManager?.markerCollection
val infoWindowAdapter = ClusterItemInfoWindowAdapter((currentView as ViewGroup), compositionContext)
markerCollection?.setInfoWindowAdapter(infoWindowAdapter)
class ClusterInfoWindowAdapter(
private val viewGroup: ViewGroup,
private val compositionContext: CompositionContext
) : GoogleMap.InfoWindowAdapter {
private val infoWindowView: ComposeView
get() = ComposeView(viewGroup.context).apply {
viewGroup.addView(this)
}
override fun getInfoContents(marker: Marker): View? {
//Override this method if you want to set only content with default background
return null
}
override fun getInfoWindow(marker: Marker): View {
return infoWindowView.applyAndRemove(compositionContext) {
MarkerContent(marker)
}
}
private fun ComposeView.applyAndRemove(
parentContext: CompositionContext,
content: @Composable () -> Unit
): ComposeView {
val result = this.apply {
setParentCompositionContext(parentContext)
setContent(content)
}
(this.parent as? MapView)?.removeView(this)
return result
}
@Composable
fun MarkerContent(marker: Marker) {
//Show anything here
}
}