You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose普通导航为何出现淡入淡出动画?

解决Jetpack Compose导航时意外出现的淡入淡出动画问题

页面切换时意外出现淡入淡出动画,是因为Compose Navigation在部分场景下会自动应用默认过渡动画。要彻底移除这些不符合预期的动画,只需在每个composable路由中显式禁用过渡配置:

修改后的MainActivity代码

setContent {
    GrooveShareTheme {
        val navController = rememberNavController()
        NavHost(
            navController = navController,
            startDestination = "auth"
        ) {
            navigation(
                startDestination = "signup",
                route = "auth"
            ) {
                composable(
                    route = "signup",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { SignUpScreen(navController, spotifyAuthViewModel) }
                composable(
                    route = "login",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { LogInScreen(navController) }
                composable(
                    route = "password_reset",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { PasswordResetScreen(navController) }
            }
            navigation(
                startDestination = "home",
                route = "main"
            ) {
                composable(
                    route = "home",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { HomeScreen(navController) }
                composable(
                    route = "friends",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { FriendsScreen(navController) }
                composable(
                    route = "add",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { AddScreen(navController, currentlyPlayingTrack) }
                composable(
                    route = "notifications",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { NotificationsScreen(navController) }
                composable(
                    route = "profile",
                    enterTransition = { null },
                    exitTransition = { null },
                    popEnterTransition = { null },
                    popExitTransition = { null }
                ) { ProfileScreen(navController, spotifyUserViewModel) }
            }
        }
    }
}

简化方案:创建扩展函数

如果需要给所有路由统一禁用动画,可以定义一个扩展函数减少重复代码:

fun NavGraphBuilder.composableNoAnimation(
    route: String,
    content: @Composable (NavBackStackEntry) -> Unit
) {
    composable(
        route = route,
        enterTransition = { null },
        exitTransition = { null },
        popEnterTransition = { null },
        popExitTransition = { null },
        content = content
    )
}

之后在NavHost中直接使用composableNoAnimation替代composable即可:

composableNoAnimation("signup") { SignUpScreen(navController, spotifyAuthViewModel) }

额外检查点

如果修改后仍有动画,检查你的GrooveShareTheme中是否设置了默认导航过渡属性,移除相关配置即可。

内容的提问来源于stack exchange,提问作者dimitris.terzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:16