Как предотвратить полную рекомпозицию при использовании mutableStateOf на экране Jetpack Compose Google Maps?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как предотвратить полную рекомпозицию при использовании mutableStateOf на экране Jetpack Compose Google Maps?

Сообщение Anonymous »

У меня есть экран Jetpack Compose, который оборачивает компонуемый GoogleMap из библиотеки Maps Compose.
Когда карта завершает загрузку, я устанавливаю логическое состояние:

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

var mapLoaded by remember { mutableStateOf(false) }
Проблема в том, что когда mapLoaded принимает значение true, весь составной объект перекомпоновывается, включая блок контента GoogleMap. Это приводит к перерисовке карты и маркеров, что приводит к заметному сбою в пользовательском интерфейсе.
Вот сокращенная версия:

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

@Composable
fun GoogleMaps(
homeDetails: HomeDetails?
) {
val style = rememberMapState()
var mapLoaded by remember { mutableStateOf(false) }

LaunchedEffect(homeDetails, mapLoaded) {
if (homeDetails != null && mapLoaded) {
style.cameraPositionState.animate(
update = CameraUpdateFactory.newLatLngZoom(
LatLng(homeDetails.lat, homeDetails.lng),
10f
),
durationMs = 500
)
}
}

GoogleMap(
modifier = Modifier.fillMaxSize(),
cameraPositionState = style.cameraPositionState,
onMapLoaded = { mapLoaded = true }
) {
// markers, overlays, etc.
}

// a few other UI buttons
}
Чего я ожидаю:
Когда срабатывает onMapLoaded, должна запускаться только анимация камеры.
Что происходит на самом деле:
Установка mapLoaded = true запускает рекомпозицию всего компонуемого объекта GoogleMaps().
Поскольку GoogleMap { … } повторно выполняет лямбда-выражение содержимого, карта визуально перерисовывается.
Мой вопрос:
  • Как я могу запустить логику загрузки карты (анимацию камеры), не вызывая перекомпоновки
    всего компонуемого объекта, включая содержимое GoogleMap?


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

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

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

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

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

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