Android Navigation Components 含共享页面时popUpTo逻辑实现方案咨询
多流程共享页面下popUpTo的最优实现方案
推荐方案:方案4(传递popUpTo目标参数)+ 独立共享嵌套导航图
该方案完全避免导航代码重复,符合Navigation组件的设计规范,实现成本最低。
具体实现逻辑如下:
- 抽离共享流程的2个页面为独立的嵌套导航图,仅配置共享流程内部的跳转规则,不设置固定popUpTo
- 为共享导航图的入口动作新增
Int类型参数popUpTarget,默认值设为-1 - 功能A侧触发进入共享流程时,传入参数
popUpTarget = R.id.功能A页面1;功能B侧触发时传入popUpTarget = R.id.功能B页面1 - 在共享流程页面2的跳转触发位置,读取参数动态构建导航配置:
// 读取入参 val targetId = arguments?.getInt("popUpTarget", -1) ?: -1 if (targetId != -1) { val navOptions = NavOptions.Builder() .setPopUpTo(targetId, inclusive = false) .build() findNavController().navigate(/* 你的跳转目标id */, null, navOptions) }
无传参备选方案
如果不想增加参数传递逻辑,可以采用方案5的简化实现,直接在共享页面2主动匹配回退栈:
val navController = findNavController() // 按优先级匹配回退栈中的目标页面 val targetId = listOf(R.id.功能A页面1, R.id.功能B页面1).firstOrNull { id -> navController.getBackStackEntry(id) != null } targetId?.let { navController.popBackStack(it, inclusive = false) }
其他方案优劣说明
- 方案1、2需要额外维护嵌套导航图的起始目的地与deeplink规则,复杂度更高,仅当存在10个以上的复用来源时才考虑
- 方案3会产生大量重复的导航配置代码,后续迭代修改共享流程时需要同步修改多份配置,维护成本极高,不推荐
官方设计规范中明确允许动态设置NavOptions,不需要为了全静态配置导航图牺牲代码复用性。
内容的提问来源于stack exchange,提问作者David Corrado
相关产品推荐
相关产品推荐

