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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 04:24:53