Как избежать ненужных рекомпозиций из-за проверки переменной состояния?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как избежать ненужных рекомпозиций из-за проверки переменной состояния?

Сообщение Anonymous »

Я добавляю много маркеров на карту Google в Jetpack Compose, и это работает, но мне нужно рисовать их только тогда, когда уровень масштабирования превышает 15, поэтому я добавил if (cameraPositionState.position.zoom > 15) перед добавлением маркеров. Это тоже работает, но работает очень медленно, потому что каждый раз, когда я перемещаю положение камеры пальцем, карта перекомпоновывает все и снова добавляет все маркеры.
Как мне избежать этой рекомпозиции при каждом перемещении камеры?
Если я удалю это, если (cameraPositionState.position.zoom > 15), то рекомпозиции исчезнут, и карта снова станет гладкой, но мне нужна эта проверка, чтобы избежать рисуем создателей, если уровень масштабирования превышает 15.
Как это решить?

Код: Выделить всё

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,
)
}
}
}
Я попробовал решение с использованием производного состояния:

Код: Выделить всё

val showMarkers by remember(cameraPositionState.position.zoom) {
derivedStateOf {
cameraPositionState.position.zoom > 15
}
}
и изменить if на if (showMarkers) { но проблема остается, перемещая камеру, приходится все перекомпоновать, снова добавляя все маркеры и отставая от карты.

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-variable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»