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

Jetpack Compose导航过渡异常行为问题求助

问题:快速导航至设置屏幕时出现异常过渡效果

我发现快速导航到设置屏幕时会出现异常过渡效果,已经尝试删除enterTransition和exitTransition参数,但问题仍未解决。以下是多模块应用的相关代码:

导航图代码

fun NavGraphBuilder.settingsGraph(navController: NavController) {
    navigation(
        startDestination = SettingsGraphDestination.InitialScreen.route,
        route = SETTINGS_GRAPH_ROUTE
    ) {
        composable(
            route= SettingsGraphDestination.InitialScreen.route,
            enterTransition = {
                fadeIn(tween(durationMillis = CommonConstants.NAVIGATION_ANIMATION_DURATION_MILLIS))
            },
            exitTransition =  {
                fadeOut(tween(durationMillis = CommonConstants.NAVIGATION_ANIMATION_DURATION_MILLIS))
            }
        ) {
            SettingsScreen(
                navController = navController,
                onPhoneNumberSettingScreenClicked = {
                    navController.navigate(
                        SettingsGraphDestination.PhoneNumberAdjustment.route
                    )
                },
                onStepStrideAdjustmentScreenClicked = {
                    navController.navigate(
                        SettingsGraphDestination.StepStrideAdjustment.route
                    )
                }
            )
        }
    }
}

SettingsScreen.kt代码

NirvanaScaffold(
    navController = navController,
    screenTitle = "تنظیمات"
) {
     Column(
        modifier = Modifier
            .fillMaxSize()
            .background(nirvanaScreenBackgroundBrush)
            .verticalScroll(rememberScrollState())
    ) {
        Spacer(modifier = Modifier.weight(0.1f))

        ButtonsArea(
            onSubscriptionButtonClicked = { onSubscriptionScreenClicked() },
            onChangePhoneNumberButtonClicked = { onPhoneNumberSettingScreenClicked() },
            onChangeStepStrideButtonClicked = { onStepStrideAdjustmentScreenClicked() },
            onChangeWeightButtonClicked = { onWeightAdjustmentScreenClicked() }
        )
        Spacer(modifier = Modifier.weight(1f))
    }
}

RootGraph.kt代码

dashboardGraph(
    navController = navController,
    nestedGraphs = {
        settingsGraph(navController = navController)
    },
    navigateToSettingsGraph = {navController.navigateToSettingsGraph()}
)

可能的原因分析
  • 父导航图的过渡设置继承:你的settingsGraph是嵌套在dashboardGraph中的子导航图,如果dashboardGraph本身定义了全局的enterTransition/exitTransition,子图会默认继承这些配置。即使删除了子图的过渡参数,父图的动画依然会生效,导致快速导航时出现异常。建议检查dashboardGraph的导航配置,确认是否存在全局过渡设置。

  • 快速导航的动画队列冲突:当快速触发导航操作时,Compose Navigation的动画系统可能出现队列冲突——前一个过渡动画还未完成,新的导航就已触发,进而导致界面闪烁、错位等异常。可以尝试在导航时添加launchSingleTop = true或popUpTo参数,避免重复入栈,同时确保动画完成后再响应下一次导航。

  • 自定义Scaffold的布局重绘问题:你使用的NirvanaScaffold是自定义组件,内部可能存在布局重绘逻辑或状态变化,在导航触发时和过渡动画产生冲突。比如Scaffold的标题栏、导航栏切换屏幕时的重绘,和设置页面的淡入淡出动画叠加,引发视觉异常。可以暂时替换成官方Scaffold测试,排查是否是自定义组件的问题。

  • 多模块导航的路由配置问题:多模块应用中,导航路由定义如果存在重复或不规范的情况,可能导致导航时的界面状态异常。检查SETTINGS_GRAPH_ROUTE和SettingsGraphDestination的路由值是否正确,确保从dashboardGraph跳转到settingsGraph的路由没有冲突。

  • 背景Brush的加载/绘制延迟:设置页面的background(nirvanaScreenBackgroundBrush)如果是复杂渐变或异步加载的资源,快速导航时可能因为Brush未完成绘制,和过渡动画叠加出现异常。可以暂时替换成纯色背景测试,确认是否是背景Brush的问题。

内容的提问来源于stack exchange,提问作者Salma KD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:02:07