2

我有一个使用新导航库的应用程序。我在 NavController 上附加了一个监听器,当我浏览应用程序时,它看起来是这样的:

  1. main_fragment
  2. authentication_subgraph
  3. loading_fragment
  4. set_username_fragment来电popBackStack(R.id.authentication, true)
  5. loading_fragment作为上面弹出回栈的一部分被移除。
  6. main_fragment
  7. squad_fragment

在某些通过 Crashlytics 向我报告的情况下,我看到来自squad_fragmentthrows 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 是空的。

4

0 回答 0