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

