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
相关产品推荐
相关产品推荐

