【发布时间】:2018-06-21 01:31:08
【问题描述】:
我有一个使用 AndroidX 导航库的应用,但我的行为很奇怪。特别是在我的应用程序进入/退出后台时。这里有两个例子:
- 在片段中的一个简单的点击监听器中,我有:
(科特林)
button.setOnClickListener {
findNavController().popBackStack()
}
从这里,我看到崩溃说它抛出了 IllegalStateException,因为它在 onSaveInstanceState 之后运行。
- 我有一个与我的
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