如何在Navigation Compose中为单个导航动作禁用退出过渡?
问题描述
我正在为应用添加一个模仿底部弹窗的强制更新页面,该流程拥有独立的NavGraphBuilder,通过以下代码触发页面展示:
LaunchedEffect(uiState.isNewUpdateRequired, uiState.showState) { Timber.tag("ForceUpdate").d("uiState changed to: $uiState") if (uiState.isNewUpdateRequired && uiState.showState == NewUpdateSheetState.Show) { navigate(Graph.ForceUpdate) { popUpTo(0) { inclusive = true } launchSingleTop = true } } }
页面可以正常显示,但新页面以slideInVertically滑入时,仍能看到前一页面的退出动画(exitTransition),不符合预期——我希望新页面直接滑盖在前一页面之上。
我已经找到一个解决方案,但想要更简洁的实现方式:
composable<Route.LoginAuth>( exitTransition = { if(forceUpdateManager.isForceUpdateVisible){ ExitTransition.None } else { exitTransition() }},
更简洁的解决方案
不需要给每个页面单独配置条件化的exitTransition,可以在导航到强制更新页面的动作中直接指定前页面的退出过渡为ExitTransition.None,集中管理动画逻辑:
LaunchedEffect(uiState.isNewUpdateRequired, uiState.showState) { Timber.tag("ForceUpdate").d("uiState changed to: $uiState") if (uiState.isNewUpdateRequired && uiState.showState == NewUpdateSheetState.Show) { navigate(Graph.ForceUpdate) { popUpTo(0) { inclusive = true } launchSingleTop = true // 禁用前页面的退出动画 exitTransition = { ExitTransition.None } // 保持新页面的底部滑入动画 enterTransition = { slideInVertically(initialOffsetY = { it }) } } } }
逻辑说明
在Jetpack Navigation Compose中,navigate的NavOptionsBuilder支持直接配置当前导航动作对应的进入/退出过渡。这种方式无需在每个页面的composable函数中添加条件判断,代码更简洁且逻辑集中,能确保触发强制更新时,前页面无退出动画,新页面直接从底部滑入覆盖,完全符合需求。
内容的提问来源于stack exchange,提问作者Stanisław Olszak
相关产品推荐
相关产品推荐

