NavDeepLinkBuilder创建深链时如何移除返回栈startDestination
解决方案
不需要修改现有导航图XML配置,也不需要额外拦截返回逻辑,只要手动传入修改过startDestination的临时导航图实例给NavDeepLinkBuilder,就能绕过默认把原startDestination压入栈底的逻辑,完全符合需求。
实现代码
// 手动inflate导航图实例,不要直接传导航图资源ID给setGraph val tempNavGraph = NavInflater(context).inflate(R.navigation.nav_graph) // 把临时导航图的起始目的地改成你需要作为栈根的FragmentA tempNavGraph.startDestination = R.id.FragmentA // 构建深链 val deepLinkPendingIntent = NavDeepLinkBuilder(context) .setGraph(tempNavGraph) .addDestination(R.id.FragmentA) // 先加栈底页面 .addDestination(R.id.FragmentB) // 后加栈顶页面 .createPendingIntent()
原理说明
NavDeepLinkBuilder内部的默认逻辑是:如果发现你第一个addDestination传入的页面ID,和当前导航图配置的startDestination不一致,就会自动把原startDestination压到返回栈最底部。
我们修改的是自己inflate出来的临时导航图对象,不会影响App其他地方对原nav_graph的正常使用,没有全局副作用。
最终生成的返回栈顺序是FragmentA -> FragmentB:点击深链直接展示栈顶的FragmentB,按一次返回退到FragmentA,再按返回直接退出,全程不会出现rootFragment。
注意点
- addDestination的调用顺序必须和返回栈从底到顶的顺序一致,栈底页先加,栈顶页后加,顺序写反会导致栈层级错乱。
- 如果需要给FragmentA或者FragmentB传参,直接用addDestination的双参数重载传入Bundle即可,参数传递逻辑不受任何影响。
内容的提问来源于stack exchange,提问作者nima
相关产品推荐
相关产品推荐

