Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
onSaveInstanceState之后的Androidx导航非法状态异常_Android_Android Architecture Navigation_Androidx - Fatal编程技术网

onSaveInstanceState之后的Androidx导航非法状态异常

onSaveInstanceState之后的Androidx导航非法状态异常,android,android-architecture-navigation,androidx,Android,Android Architecture Navigation,Androidx,我有一个应用程序使用AndroidX的导航库,但我有一些奇怪的行为。尤其是在我的应用程序进入/退出后台时。以下是两个例子: 在片段中的一个简单点击侦听器中,我有: (科特林) 从这里,我看到崩溃说它抛出了一个非法状态异常,因为它在saveInstanceState上运行 我有一个与我的Fragment关联的ViewModel,我将我的观察者注册到Fragment视图的生命周期中。这意味着我会在启动时收到通知。一些关键事件(如登录状态)决定应用程序的导航。在我的例子中,我有一个启动屏幕,可以进入登

我有一个应用程序使用AndroidX的导航库,但我有一些奇怪的行为。尤其是在我的应用程序进入/退出后台时。以下是两个例子:

  • 在片段中的一个简单点击侦听器中,我有:
  • (科特林)

    从这里,我看到崩溃说它抛出了一个
    非法状态异常
    ,因为它在saveInstanceState上运行

  • 我有一个与我的
    Fragment
    关联的
    ViewModel
    ,我将我的观察者注册到Fragment视图的生命周期中。这意味着我会在启动时收到通知。一些关键事件(如登录状态)决定应用程序的导航。在我的例子中,我有一个启动屏幕,可以进入登录屏幕或主屏幕。一旦用户完成登录,我将重置导航(将我带回初始屏幕)。现在auth状态已经就绪,我想导航到主片段,这通常会引发一个错误,因为在
    FragmentManager
    被认为就绪之前必须调用
    onResume
    。我有一个错误,说我在一个事务的中间,我不能添加一个新的。为了解决这个问题,我必须编写以下奇怪的代码:
  • (科特林)

    有人知道如何让导航控制器在不添加这些变通方法的情况下更好地处理片段生命周期吗?

    根据:

    FragmentNavigator现在会在FragmentManager保存状态后忽略导航操作,从而避免出现“onSaveInstanceState之后无法执行此操作”异常


    因此升级到alpha03应该会删除此错误。

    您使用的导航版本是什么?1.0.0-alpha02用于片段和ui,1.0.0-alpha01用于崩溃期间的插件,最近更新到02,但该版本尚未投入生产,因此我还没有任何堆栈跟踪。是否可以将
    commitAllowingStateLoss
    与导航组件一起使用?@bitvale-否。您不应该丢失状态。
    button.setOnClickListener {
        findNavController().popBackStack()
    }
    
    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() }
        }
    }