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

Navigation Component:通过Deep Link跳转后如何返回上一目标页?

跨导航图Deep Link跳转后正常返回的解决方案

当通过Deep Link跨导航图跳转后,调用popBackStack()出现目标页重启而非返回原页面的问题,核心原因是Deep Link默认会将目标页所属的整个导航图完整入栈,打乱了原有的回退栈结构。以下是两种可行的解决方法:

方法一:跳转时配置导航选项

在执行navigate()时,通过NavOptions指定回退栈规则,确保原页面的栈位置被保留:

val navOptions = NavOptions.Builder()
    // 设置回退到原页面所在的导航节点,false表示保留该节点
    .setPopUpTo(R.id.your_original_destination_or_graph_id, false)
    // 启用SingleTop模式,避免重复创建目标页,同时修正栈结构
    .setLaunchSingleTop(true)
    .build()

Navigation.findNavController(view).navigate(Uri.parse(link), navOptions)

配置完成后,再调用popBackStack()即可正常回到跳转前的页面。

方法二:手动指定回退目标

如果无法修改跳转逻辑,可以在跳转前记录当前页面的ID,返回时直接弹出到该ID:

// 跳转前记录当前栈的目标ID
val currentDestId = Navigation.findNavController(view).currentDestination?.id

// 执行Deep Link跳转
Navigation.findNavController(view).navigate(Uri.parse(link))

// 返回时直接回到记录的页面
currentDestId?.let {
    Navigation.findNavController(view).popBackStack(it, false)
}

关键说明

  • setLaunchSingleTop(true)是核心:它会让Navigation复用已存在的目标页实例,而非重新创建整个导航图的栈,从而避免回退时的异常。
  • popBackStack()的第二个参数inclusive设为false,表示保留指定ID的页面;若设为true,则会将该页面也从栈中移除。

内容的提问来源于stack exchange,提问作者Howard Lau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:40:17