Pablo
03/20/2024, 10:24 PMif (uiState.selectedPlace != null) {
AnimatedVisibility(true) {
PlaceDetail(
place = uiState.selectedPlace,
modifier = modifier
)
}
} else {
ListScreen(
title = stringResource(id = uiState.selectedCategory?.nameResource ?: R.string.empty_string),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
}
Stylianos Gakis
03/20/2024, 10:38 PMuiState.selectedPlace
is null, AnimatedVisibility just leaves composition completely.
If you tried something like
Row {
ListScreen(
title = stringResource(id = uiState.selectedCategory?.nameResource ?: R.string.empty_string),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
AnimatedVisibility(uiState.selectedPlace != null) {
PlaceDetail(
place = uiState.selectedPlace,
modifier = modifier
)
}
}
You’re probably closer to what you want to do here.
Can read more herePablo
03/20/2024, 10:46 PMPablo
03/20/2024, 10:48 PMPablo
03/20/2024, 10:54 PMAnimatedVisibility(
visible = uiState.selectedPlace != null,
enter = fadeIn(),
exit = fadeOut()
) {
PlaceDetail(
place = uiState.selectedPlace,
onBackPressed = { viewModel.updateCurrentPlace(null) },
modifier = modifier
)
}
AnimatedVisibility(
visible = uiState.selectedPlace == null,
enter = fadeIn(),
exit = fadeOut()
) {
ListScreen(
title = stringResource(
id = uiState.selectedCategory?.nameResource ?: R.string.empty_string
),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
}
Pablo
03/20/2024, 10:54 PMPablo
03/20/2024, 10:54 PMStylianos Gakis
03/20/2024, 10:55 PMStylianos Gakis
03/20/2024, 10:55 PMPablo
03/20/2024, 10:56 PMPablo
03/20/2024, 10:56 PMStylianos Gakis
03/20/2024, 10:56 PMPablo
03/20/2024, 10:57 PMPablo
03/20/2024, 10:57 PMPablo
03/20/2024, 10:57 PMPablo
03/20/2024, 10:58 PMPablo
03/20/2024, 10:58 PMAnimatedVisibility(
visible = uiState.selectedPlace != null,
enter = fadeIn(),
exit = fadeOut()
) {
Pablo
03/20/2024, 10:58 PMPablo
03/20/2024, 11:11 PMPablo
03/20/2024, 11:12 PMPablo
03/20/2024, 11:12 PMPablo
03/20/2024, 11:12 PMAnimatedVisibility(
visible = uiState.selectedPlace != null,
enter = fadeIn(animationSpec = tween(700)),
exit = fadeOut(animationSpec = tween(700))
) {
PlaceDetail(
place = uiState.selectedPlace,
onBackPressed = { viewModel.updateCurrentPlace(null) },
modifier = modifier
)
}
AnimatedVisibility(
visible = uiState.selectedPlace == null,
enter = fadeIn(animationSpec = tween(700)),
exit = fadeOut(animationSpec = tween(700))
) {
ListScreen(
title = stringResource(
id = uiState.selectedCategory?.nameResource ?: R.string.empty_string
),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
}
Pablo
03/20/2024, 11:13 PMStylianos Gakis
03/20/2024, 11:13 PMBackHandler
call?Pablo
03/20/2024, 11:14 PMPablo
03/20/2024, 11:15 PMonBackPressed = { viewModel.updateCurrentPlace(null) },
Stylianos Gakis
03/20/2024, 11:22 PMuiState.selectedPlace
inside the ListScreen for example. but as you are animating out, it is actually null. So maybe the way you got the composable to render in that scenario you just show nothing.
It’s a guess, but it’d be funny if that’s it since it’s literally the thread above this one https://kotlinlang.slack.com/archives/CJLTWPH7S/p1710944106432999Pablo
03/20/2024, 11:34 PMAnimatedContent(targetState = uiState.selectedPlace != null) { targetCount ->
PlaceDetail(
place = uiState.selectedPlace,
onBackPressed = { viewModel.updateCurrentPlace(null) },
modifier = modifier
)
}
Pablo
03/20/2024, 11:35 PMStylianos Gakis
03/20/2024, 11:41 PMAnimatedContent(targetState = uiState.selectedPlace) { selectedPlace ->
if (selectedPlace != null) {
PlaceDetail(
place = uiState.selectedPlace,
onBackPressed = { viewModel.updateCurrentPlace(null) },
modifier = modifier
)
} else {
ListScreen(
title = stringResource(
id = uiState.selectedCategory?.nameResource ?: R.string.empty_string
),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
}
}
Try something more like this
And add the right animation specs etcPablo
03/20/2024, 11:49 PMStylianos Gakis
03/21/2024, 12:04 AMAnimatedContent(targetState = uiState) { uiState ->
if (uiState.selectedPlace != null) {
PlaceDetail(
place = uiState.selectedPlace,
onBackPressed = { viewModel.updateCurrentPlace(null) },
modifier = modifier
)
} else {
ListScreen(
title = stringResource(
id = uiState.selectedCategory?.nameResource ?: R.string.empty_string
),
listItems = uiState.placesList,
selectedItem = uiState.selectedPlace,
onItemClicked = {
viewModel.updateCurrentPlace(it as Place)
},
modifier = modifier
)
}
}
Actually that’s what you want here. I was wrongly using the uiState which came from outside the AnimatedContent, but you actually need to use the one provided by the lambda to get the right behaviorPablo
03/21/2024, 10:34 AMStylianos Gakis
03/21/2024, 10:34 AM