我有一个使用 AndroidX 导航库的应用程序,但我的行为很奇怪。特别是在我的应用程序进入/退出后台时。这里有两个例子:
- 在片段中的一个简单的点击监听器中,我有:
(科特林)
button.setOnClickListener {
findNavController().popBackStack()
}
由此,我看到崩溃说它在IllegalStateException
运行之后抛出了一个onSaveInstanceState
。
- 我有一个
ViewModel
关联,Fragment
我将我的观察者注册到片段视图的生命周期。这意味着我会在onStart
. 一些关键事件,例如登录状态决定了应用的导航。就我而言,我有一个启动屏幕,可以转到登录屏幕或主屏幕。用户完成登录后,我会重置导航(将我带回初始屏幕)。现在身份验证状态已准备就绪,我想导航到主片段,这通常会引发错误,因为onResume
必须在FragmentManager
被认为已准备好之前调用。我收到一条错误消息,提示我正在进行交易,无法添加新交易。为了解决这个问题,我不得不编写这段奇怪的代码:
(科特林)
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() }
}
}
有谁知道我如何让导航控制器在片段生命周期中发挥出色而无需添加这些变通方法?