我有一个使用新导航库的应用程序。我在 NavController 上附加了一个监听器,当我浏览应用程序时,它看起来是这样的:
main_fragment
authentication_subgraph
loading_fragment
set_username_fragment
来电popBackStack(R.id.authentication, true)
loading_fragment
作为上面弹出回栈的一部分被移除。main_fragment
squad_fragment
在某些通过 Crashlytics 向我报告的情况下,我看到来自squad_fragment
throws anIllegalArgumentException
的调用,调用看起来像:
close.setOnClickListener {
if (isResumed) {
findNavController().popBackStack()
}
}
这应该并且在我运行的每个测试中都简单地弹出squad_fragment
并给我留下main_fragment
,但在某些情况下(昨晚 20 次)我在这里遇到了一个异常,说后面的堆栈是空的。怎么会这样?有什么我做错了吗?
更新
我终于能够复制这个问题了。main_fragment
当我从应用程序的后台导航到任何地方,做一堆其他事情,然后从最近列表返回应用程序时,这似乎会发生。导航库似乎没有恢复后台堆栈?我现在使用的是 1.0.0-alpha02 版本。看来,如果popBackStack()
我没有调用它,而是调用navigateUp()
它有效,但这让我感到担忧,因为我目前退出身份验证子图的方式是通过调用popBackStack(R.id.authentication, true)
以返回触发身份验证流的任何片段。这最终将以相同的方式中断。
查看 NavController 中的代码,似乎返回堆栈已保存和恢复。所以我不明白为什么后台堆栈返回为空。此外,NavHostFragment 似乎正在备份 NavController 状态以及恢复它,所以我不知道为什么我的 backstack 是空的。