【问题标题】:Androidx Navigation IllegalStateException after onSaveInstanceStateonSaveInstanceState 之后的 Androidx Navigation IllegalStateException
【发布时间】:2018-06-21 01:31:08
【问题描述】:

我有一个使用 AndroidX 导航库的应用,但我的行为很奇怪。特别是在我的应用程序进入/退出后台时。这里有两个例子:

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

(科特林)

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

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

  1. 我有一个与我的Fragment 关联的ViewModel,并且我将我的观察者注册到片段视图的生命周期。这意味着我会在onStart 期间收到通知。一些关键事件,例如登录状态决定了应用的导航。就我而言,我有一个启动屏幕,可以转到登录屏幕或主屏幕。用户完成登录后,我会重置导航(将我带回初始屏​​幕)。现在身份验证状态已准备好,我想导航到主片段,这通常会引发错误,因为必须在 FragmentManager 被认为已准备好之前调用 onResume。我收到一条错误消息,提示我正在进行交易,无法添加新交易。为了解决这个问题,我不得不编写这段奇怪的代码:

(科特林)

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() }
    }
}

有谁知道我如何让导航控制器在片段生命周期中很好地发挥作用,而无需添加这些变通方法?

【问题讨论】:

  • 您使用的是什么版本的导航?
  • 片段和 ui 为 1.0.0-alpha02,崩溃期间插件为 1.0.0-alpha01,最近更新为 02,但该版本尚未投入生产,所以我没有有任何堆栈跟踪。

标签: android android-architecture-navigation androidx


【解决方案1】:

根据Navigation 1.0.0-alpha03 release notes

FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,避免出现“Can't perform this action after onSaveInstanceState”异常b/110987825

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

【讨论】:

  • 导航组件可以使用commitAllowingStateLoss吗?
  • @bitvale - 没有。你根本不应该失去状态。
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多