Alex
02/23/2023, 7:47 AMAnimatedVisibility
?
Code in 🧵Alex
02/23/2023, 7:48 AM@Composable
public inline fun Transition<EnterExitState>.ListenerEffect(
noinline transitionSpec: @Composable Transition.Segment<EnterExitState>.() -> FiniteAnimationSpec<Int> = {
spring(visibilityThreshold = 1)
},
label: String = "ListenerEffect",
onEnterStart: () -> Unit = {},
onEnterEnd: () -> Unit = {},
onExitStart: () -> Unit = {},
onExitEnd: () -> Unit = {},
) {
val animationProgress by animateValue(Int.VectorConverter, transitionSpec, label) { enterExitState ->
when (enterExitState) {
EnterExitState.PreEnter -> 200
EnterExitState.Visible -> 100
EnterExitState.PostExit -> 0
}
}
when (animationProgress) {
200 -> onEnterStart()
100 -> when (currentState) {
EnterExitState.PreEnter -> when (targetState) {
EnterExitState.Visible -> onEnterEnd()
else -> Unit // ignore
}
EnterExitState.Visible -> when (targetState) {
EnterExitState.PostExit -> onExitStart()
else -> Unit // ignore
}
else -> Unit // ignore
}
0 -> onExitEnd()
}
}
Alex
02/23/2023, 7:48 AMAlex
02/23/2023, 7:49 AMDoris Liu
02/23/2023, 7:37 PMAnimatedVisibility
overload that takes a MutableTransitionState, and observe the state change in a snapshotFlowDoris Liu
02/23/2023, 7:42 PMval visibleState = remember { MutableTransitionState(false)}
visibleState.targetState = ..
LaunchedEffect(Unit) {
snapshotFlow { Pair(visibleState.currentState, visibleState.targetState) }.collect {
if (it.first == it.second) {
if (visibleState.currentState) {
// enter finished
} else {
// exit finished
}
} else {
if (visibleState.targetState) {
// enter started
} else {
// exit started
}
}
}
}
AnimatedVisibility(visibleState = visibleState) {
...
}
Alex
02/23/2023, 7:54 PMDoris Liu
02/23/2023, 8:01 PMTransition.current/targetState
instead.