Ниже у меня есть Box() составной. Внутри у меня есть пользовательские компоновочные элементы GoogleMap() и BottomActionBar(). Проблема в том, что когда маркер добавляется или находится в состоянии перетаскивания, компоновка BottomActionBar() перестраивается в то же время, когда маркер перетаскивается. Желаемый результат состоит в том, что BottomActionBar() перекомпонуется только в том случае, если isMarkerInDragState действительно изменен, но его перекомпоновка происходит, даже если маркер находится в том же состоянии и перетаскивается. А также, почему MainMapView() перекомпоновывается, потому что карта Google ограничена компоновкой Box.
Ваша помощь действительно ценна!
@Composable
private fun MainMapView(
modifier: Modifier = Modifier,
lastKnownLocation: Location?,
onMapClick: (LatLng) -> Unit,
geoPoints: List<LatLng>,
isMarkerInDragState: Boolean,
onDragUpdate: (Boolean) -> Unit,
onClearMapButtonClick: () -> Unit,
onGeoPointUpdate: (MutableList<LatLng>) -> Unit
) {
Box(
modifier = modifier
.fillMaxSize()
.padding(contentPadding),
) {
val cameraPositionState = rememberCameraPositionState()
val context = LocalContext.current
val markers = mutableListOf<Unit>()
LaunchedEffect(lastKnownLocation) {
lastKnownLocation?.let {
cameraPositionState.animate(
update = CameraUpdateFactory.newLatLngZoom(
LatLng(it.latitude, it.longitude),
18f
)
)
}
}
GoogleMap(
modifier = Modifier.fillMaxSize(),
cameraPositionState = cameraPositionState,
properties = MapProperties(
isMyLocationEnabled = true,
mapType = MapType.Hybrid
),
uiSettings = MapUiSettings(
mapToolbarEnabled = false,
zoomControlsEnabled = false
),
onMapClick = {
onMapClick(it)
}
) {
if (geoPoints.isNotEmpty()) {
DrawPolygon(points = geoPoints)
for ((index, point) in geoPoints.withIndex()) {
val markerState =
rememberMarkerState(position = LatLng(point.latitude, point.longitude))
LaunchedEffect(markerState.position) {
val positions = geoPoints.toMutableList()
val pointIndex = positions.indexOf(point)
if (pointIndex < 0) {
return@LaunchedEffect
}
positions[pointIndex] = markerState.position
onGeoPointUpdate(positions)
}
LaunchedEffect(markerState.dragState) {
when (markerState.dragState) {
DragState.DRAG -> onDragUpdate(true)
DragState.START -> {}
DragState.END -> onDragUpdate(false)
}
}
val marker = Marker(
state = markerState,
visible = true,
title = "Point ${index + 1}",
draggable = true
)
markers.add(marker)
}
}
}
BottomActions(
modifier = Modifier
.align(Alignment.BottomCenter),
isVisible = geoPoints.size > 2,
onClearMapButtonClick = {
onClearMapButtonClick()
}
)
}
}
Я не могу воспроизвести ваш код в своей среде. Если вы можете предоставить минимально воспроизводимый пример , это было бы круто.





Я не совсем понимаю, почему вы используете несколько запущенных эффектов. Но, насколько я знаю, злоупотреблять ими не следует, как указано: developer.android.com/develop/ui/compose/… .