onSaveInstanceState之后的Androidx导航非法状态异常
我有一个应用程序使用AndroidX的导航库,但我有一些奇怪的行为。尤其是在我的应用程序进入/退出后台时。以下是两个例子:onSaveInstanceState之后的Androidx导航非法状态异常,android,android-architecture-navigation,androidx,Android,Android Architecture Navigation,Androidx,我有一个应用程序使用AndroidX的导航库,但我有一些奇怪的行为。尤其是在我的应用程序进入/退出后台时。以下是两个例子: 在片段中的一个简单点击侦听器中,我有: (科特林) 从这里,我看到崩溃说它抛出了一个非法状态异常,因为它在saveInstanceState上运行 我有一个与我的Fragment关联的ViewModel,我将我的观察者注册到Fragment视图的生命周期中。这意味着我会在启动时收到通知。一些关键事件(如登录状态)决定应用程序的导航。在我的例子中,我有一个启动屏幕,可以进入登
非法状态异常
,因为它在saveInstanceState上运行
Fragment
关联的ViewModel
,我将我的观察者注册到Fragment视图的生命周期中。这意味着我会在启动时收到通知。一些关键事件(如登录状态)决定应用程序的导航。在我的例子中,我有一个启动屏幕,可以进入登录屏幕或主屏幕。一旦用户完成登录,我将重置导航(将我带回初始屏幕)。现在auth状态已经就绪,我想导航到主片段,这通常会引发一个错误,因为在FragmentManager
被认为就绪之前必须调用onResume
。我有一个错误,说我在一个事务的中间,我不能添加一个新的。为了解决这个问题,我必须编写以下奇怪的代码:因此升级到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() }
}
}