我正在按照 this 示例创建可组合的 Google MapView
。到目前为止,除了 cloud-based styling 之外,一切都很好。在我通过 LiveData
更改暗/亮主题后,除地图外,所有内容都会相应地重新组合。
这是我目前所拥有的:
@Composable
fun rememberMapViewWithLifecycle(): MapView {
val context = LocalContext.current
val darkTheme = Global.viewModel.theme.observeAsState()
val mapView = remember { MapView(context, GoogleMapOptions().mapId(if (darkTheme.value == "Dark") DARK_CLOUD_THEME_ID else LIGHT_CLOUD_THEME_ID)).apply {
id = R.id.map
}
}
// Makes MapView follow the lifecycle of this composable
val lifecycleObserver = rememberMapLifecycleObserver(mapView)
val lifecycle = LocalLifecycleOwner.current.lifecycle
DisposableEffect(lifecycle) {
lifecycle.addObserver(lifecycleObserver)
onDispose {
lifecycle.removeObserver(lifecycleObserver)
}
}
return mapView
}
如何更新 Google 地图样式?我的第一个想法是强制重构,但似乎这是不可能的,因为 compose 引擎会处理这个问题。如果可能,我想避免回到 .json
地图格式。
答案 0 :(得分:0)
这就是 remember
的工作原理:它不会在重新组合时被召回。
这里应该对您有所帮助的是 derivedStateOf
:每次计算中使用的任何状态发生更改时,它都会重新计算。像这样:
val mapView by derivedStateOf { MapView(context, GoogleMapOptions().mapId(if (darkTheme.value == "Dark") DARK_CLOUD_THEME_ID else LIGHT_CLOUD_THEME_ID)).apply {
id = R.id.map
}
}
另外别忘了加import androidx.compose.runtime.getValue
,因为AS有一个bug,就是不加这个import。