Vsevolod Ganin
06/08/2021, 2:27 PMAnimatedContenttargetStatetargetStatetargetStateDoris Liu
06/08/2021, 5:25 PMtargetStatetargetStateVsevolod Ganin
06/10/2021, 10:04 PMDoris Liu
06/10/2021, 10:20 PMequalsVsevolod Ganin
06/11/2021, 10:29 AMsealed class Screen : Parcelable {
    abstract fun reduce(action: Action): Screen
    @Parcelize
    data class ClickTrackList(val state: ClickTrackListScreenState) : Screen() {
        ...
    }
    @Parcelize
    data class PlayClickTrack(val state: PlayClickTrackScreenState) : Screen() {
        ...
    }
    @Parcelize
    data class EditClickTrack(val state: EditClickTrackScreenState) : Screen() {
        ...
    }
    @Parcelize
    data class Metronome(val state: MetronomeScreenState?) : Screen() {
        ...
    }
    @Parcelize
    data class Settings(val state: SettingsScreenState?) : Screen() {
        ...
    }
    @Parcelize
    data class SoundLibrary(val state: SoundLibraryState?) : Screen() {
        ...
    }
}
@Composable
fun ContentView(
    screen: Screen,
    position: Int,
    dispatch: Dispatch,
) {
    val modifier = Modifier.fillMaxSize()
    val previousPosition = remember { mutableStateOf(position) }
    val isPush = remember { mutableStateOf(true) }
    if (position != previousPosition.value) {
        isPush.value = position > previousPosition.value
        previousPosition.value = position
    }
    AnimatedContent(
        targetState = position,
        transitionSpec = {
            if (isPush.value) {
                slideIntoContainer(towards = AnimatedContentScope.SlideDirection.Left) with
                        slideOutOfContainer(towards = AnimatedContentScope.SlideDirection.Left)
            } else {
                slideIntoContainer(towards = AnimatedContentScope.SlideDirection.Right) with
                        slideOutOfContainer(towards = AnimatedContentScope.SlideDirection.Right)
            }
        }
    ) { targetPosition ->
        val targetScreen by remember { screen }
        when (@Suppress("NAME_SHADOWING") val screen = targetScreen) {
            is Screen.ClickTrackList -> ClickTrackListScreenView(screen.state, modifier, dispatch)
            is Screen.PlayClickTrack -> PlayClickTrackScreenView(screen.state, modifier, dispatch)
            is Screen.EditClickTrack -> EditClickTrackScreenView(screen.state, modifier, dispatch)
            is Screen.Metronome -> MetronomeScreenView(screen.state, modifier, dispatch)
            is Screen.Settings -> SettingsScreenView(screen.state, modifier, dispatch)
            is Screen.SoundLibrary -> SoundLibraryScreenView(screen.state, modifier, dispatch)
        }
    }
}equalsVsevolod Ganin
06/11/2021, 10:43 AMscreenVsevolod Ganin
06/11/2021, 10:46 AMrememberscreentargetStateDoris Liu
06/11/2021, 7:41 PMscreentargetStatepositionDoris Liu
06/11/2021, 7:48 PMpositionMutableMapval map = remember { mutableMapOf<Int, Screen>() }
map[position] = screen
AnimatedContent(...) {targetState ->
   map[targetState]?.let { // return appropriate composable based on the screen object } ?: {}
}transition.targetState == transition.initialStateVsevolod Ganin
06/11/2021, 9:55 PM