使用导航组件发布底部导航条



当按下返回按钮时,底部导航视图的默认行为是导航返回到home片段,再次按下返回按钮将退出应用程序,但是,当home片段不是导航中的根片段时,问题就出现了。例如,如果登录屏幕在主屏幕之前(这是底部导航视图),在导航到主屏幕之后,每个标签导航都被放在堆栈中,这是非常奇怪的。即使您尝试使用popUpTo和popUpToInclusive删除导航图中的登录屏幕,也没有任何变化。有什么建议吗?

每个标签栏的导航都放在堆栈中,这很奇怪

这是setupWithNavController实现的结果。非常简单:

  • 当在导航栏上选中某项时:
    • 将当前backstack弹出到导航图的起始目的地,且不包括该目的地(1)
    • 导航到菜单项对应的目的地
  • NavController改变目的地时:
    • 通过将目标ID与菜单项ID(也是目标ID)匹配,识别相应的菜单项
    • 只需将标识项设置为选中

导航意外地开始堆叠是你的backstack与setupWithNavController实现的期望不同步的结果,如(1)。也就是说,如果图的开始目的地不存在于你的backstack中的任何地方,当前标签的backstack将不会弹出,导致标签最终堆叠在彼此的顶部。

因此,只要您确保始终将导航图的起始目的地保持在backstack中合理的位置,就应该没问题。根据您的特定情况,将导航栏上的默认选项卡作为NavController使用的导航栏设置的导航图的起始目的地也是一个好主意。

注:Google至少应该在setupWithNavController的文档中提到这个需求。我非常不喜欢这种神奇的黑盒实现,因为它明显存在被滥用的风险。

最新更新