From dff2b0a13a7c0c4939ce310be8131fc653737492 Mon Sep 17 00:00:00 2001 From: Uli Bubenheimer Date: Tue, 2 Jan 2024 19:11:41 -0500 Subject: [PATCH] Address spurious subcomposition recompositions by delaying state updates to after parent composition, not during parent composition --- .../google/maps/android/compose/GoogleMap.kt | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt b/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt index 8e89cb2a..90dfaab0 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt @@ -27,6 +27,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -105,15 +106,20 @@ public fun GoogleMap( // rememberUpdatedState and friends are used here to make these values observable to // the subcomposition without providing a new content function each recomposition - val mapClickListeners = remember { MapClickListeners() }.also { - it.indoorStateChangeListener = indoorStateChangeListener - it.onMapClick = onMapClick - it.onMapLongClick = onMapLongClick - it.onMapLoaded = onMapLoaded - it.onMyLocationButtonClick = onMyLocationButtonClick - it.onMyLocationClick = onMyLocationClick - it.onPOIClick = onPOIClick + val mapClickListeners = remember { MapClickListeners() } + + SideEffect { + mapClickListeners.also { + it.indoorStateChangeListener = indoorStateChangeListener + it.onMapClick = onMapClick + it.onMapLongClick = onMapLongClick + it.onMapLoaded = onMapLoaded + it.onMyLocationButtonClick = onMyLocationButtonClick + it.onMyLocationClick = onMyLocationClick + it.onPOIClick = onPOIClick + } } + val currentLocationSource by rememberUpdatedState(locationSource) val currentCameraPositionState by rememberUpdatedState(cameraPositionState) val currentContentPadding by rememberUpdatedState(contentPadding)