onSaveInstanceState 之后的 Androidx Navigation IllegalStateException

Androidx Navigation IllegalStateException after onSaveInstanceState

我有一个使用 AndroidX 导航库的应用程序,但我遇到了奇怪的行为。特别是我的应用程序在后台运行 in/out。这里有两个例子:

  1. 在片段中的一个简单的点击侦听器中,我有:

(科特林)

button.setOnClickListener {
    findNavController().popBackStack()
}

从这里,我看到崩溃说它抛出了一个 IllegalStateException,因为它在 onSaveInstanceState 之后 运行。

  1. 我有一个 ViewModel 与我的 Fragment 关联,我将我的观察者注册到片段视图的生命周期。这意味着我会在 onStart 期间收到通知。一些关键事件,例如登录状态,决定了应用程序的导航。在我的例子中,我有一个可以转到登录屏幕或主屏幕的初始屏幕。用户完成登录后,我会重置导航(将我带回初始屏​​幕)。现在 auth 状态已准备就绪,我想导航到主要片段,这经常会引发错误,因为必须在 FragmentManager 被认为准备就绪之前调用 onResume。我收到一条错误消息,提示我正处于 t运行saction 的中间,无法添加新的。为了解决这个问题,我不得不编写这段 st运行ge 代码:

(科特林)

private fun safeNavigateToMain() {
    if (fragmentManager == null) {
      return
    }
    if (!isResumed) {
        view?.post { safeNavigateToMain() }
        return
    }
    try {
        findNavController().navigate(R.id.main)
    } catch (tr: Throwable) {
        view?.post { safeNavigateToMain() }
    }
}

有谁知道如何让导航控制器在不添加这些解决方法的情况下很好地处理片段生命周期?

根据 Navigation 1.0.0-alpha03 release notes:

FragmentNavigator now ignores navigation operations after FragmentManager has saved state, avoiding “Can not perform this action after onSaveInstanceState” exceptions b/110987825

所以升级到 alpha03 应该可以消除这个错误。