kotlin 获得缩放级别,而无需重新组合整个GoogleMap

t2a7ltrp  于 2023-05-01  发布在  Kotlin
关注(0)|答案(1)|浏览(107)

我正在使用Google Maps与Compose。我有个问题要解决我认为这将是相当容易的代码,但它看起来像我错过了一些东西。
我的Google Map在compose中很常见:

GoogleMap(
    modifier = Modifier.fillMaxSize(),
    cameraPositionState = cameraPositionState,
    properties = MapProperties(isMyLocationEnabled = true),
    uiSettings = MapUiSettings(
        myLocationButtonEnabled = false,
        zoomControlsEnabled = false,
        zoomGesturesEnabled = true,
        mapToolbarEnabled = true
    )
)

我想跳过重新构图时,缩放水平将达到让我们说水平14。我想换记号笔。我已经有记号笔了。整个名单。
问题是--每次我阅读cameraPositionState值时--整个GoogleMap都被重新组合(也是标记)。
我能够通过使用这种方法来限制数量或重组:

LaunchedEffect(localCameraPositionState.isMoving && cameraPositionState.cameraMoveStartedReason==CameraMoveStartedReason.GESTURE) {
...
}

但这不是解决办法。问题是-每次我试图读取cameraPositionState.position.zoom-它都会刷新。
当缩放达到14级时,我想将一些事件推到标记。
最好的方法是什么?

pjngdqdw

pjngdqdw1#

如果你想改变你的视图,你可以使用derivedStateOf:

val isMoving by remember { derivedStateOf { cameraPositionState.isMoving } }

现在,如果你在视图树中需要isMoving,重组只会在cameraPositionState.isMoving被改变时发生,而不是在任何cameraPositionState变量改变时发生--只要你不在其他地方使用cameraPositionState
如果你需要触发一些动作,并且根本不需要重新组合,你可以使用snapshotFlow

LaunchedEffect(Unit) {
    snapshotFlow { cameraPositionState.isMoving }
        .collect { isMoving ->
            someAction(isMoving)
        }
}

基本上derivedStateOfsnapshotFlow的工作原理是相同的:你可以根据任意数量的状态来计算结果值,只有当结果计算与上次计算不同时,状态才会被更新或者流值才会被释放。

相关问题