我有一个使用新导航库的应用程序。我已经在NavController上附加了一个侦听器,这是我浏览该应用程序时的样子:
main_fragment
authentication_subgraph
loading_fragment
set_username_fragment
呼叫popBackStack(R.id.authentication, true)
loading_fragment
已作为上方弹出堆栈的一部分删除。main_fragment
squad_fragment
在某些情况下,通过Crashlytics报告给我的消息显示,来自squad_fragment
的呼叫抛出了IllegalArgumentException
,该呼叫看起来像:
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状态并正在恢复它,因此我不知道为什么我的后栈为空。