当 mapId 改变时重新组合 MapView

时间:2021-05-22 14:53:38

标签: android kotlin android-jetpack-compose

我正在按照 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 地图格式。

1 个答案:

答案 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。