Estou adicionando muitos marcadores em um mapa do Google no Jetpack Compose, e funciona, mas preciso pintá-los apenas quando o nÃvel de zoom estiver acima de 15, então adicionei if (cameraPositionState.position.zoom > 15)
antes de adicionar os marcadores. Também funciona, mas funciona muito lento porque cada vez que movo a posição da câmera com o dedo, o mapa recompõe tudo e adiciona novamente todos os marcadores.
Como posso evitar essa recomposição toda vez que a câmera for movida?
Se eu remover isso, if (cameraPositionState.position.zoom > 15)
as recomposições desaparecem e o mapa fica suave novamente, mas preciso dessa verificação para evitar pintar os criadores se o nÃvel de zoom estiver acima de 15.
Como resolver isso?
val cameraPositionState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(city, 13f)
}
GoogleMap(modifier = Modifier.fillMaxSize(), cameraPositionState = cameraPositionState) {
if (cameraPositionState.position.zoom > 15) { // THIS LINE IS THE ISSUE
val bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_bus_mini)
for (busStop in uiState.data) {
Marker(
state = rememberMarkerState(position = LatLng(busStop.lat, busStop.lon)),
title = busStop.name, icon = bitmapDescriptor,
)
}
}
}
Tentei uma solução usando derivedstateof
:
val showMarkers by remember(cameraPositionState.position.zoom) {
derivedStateOf {
cameraPositionState.position.zoom > 15
}
}
e mudando o if por if (showMarkers) {
mas o problema persiste, movendo a câmera, faz tudo recompor adicionando todos os marcadores novamente e atrasando o mapa
Para evitar composição em cada quadro quando um valor de estado muda, você pode usar derivedStateOf ou SnapshotFlow .
Mas, como implÃcito em documentos, a computação derivedState é pesada, mas não tem impacto como recomposições excessivas.
Outras opções são usar
snapshotFlow
insideLaunchedEffect
para transformá-lo em Flow e usar um MutableState e definir seu valorcollect/launchIn
para obterState
apenas 2 resultados.