我在演示应用程序中使用android导航组件。我有一个非常简单的案例。一个活动,两个片段,A和B。我已经按照Google的示例应用程序设置了导航控件。当我尝试使用简单的onClickListener从A打开片段B时,如下所示:
val button.setOnClickListener {
val action = AFragmentDirections.openFragmentB()
findNavController().navigate(action)
}
一切正常。 B片段将打开,然后通过点击“后退”按钮将其弹出。 但是,当我尝试通过LiveData观察器使用它时,就像这样:
viewModel.openFragmentB.observe(viewLifecycleOwner, Observer {
val action = AFragmentDirections.openFragmentB()
findNavController().navigate(action)
})
片段B打开,但是通过点击“后退”按钮,应用程序因错误而崩溃 NavController未知导航目标com.myapp:id / open_fragmetn_b。
为什么会发生这种情况,以及如何将导航组件与LiveData一起使用?
答案 0 :(得分:1)
发生此崩溃的原因是,当您单击“后退”按钮时,会再次通知您的视图模型openFragmentB观察者,并且它正在尝试使用操作openFragmentB导航到Fragment B,但此时NavController的当前目标仍然是Fragment B,而Fragment B没有动作openFragmentB。
有多种解决方案,简单的方法是在观察者内部添加值是否不为null并在最后将openFragmentB值设置为null:
if(it!=null) {
val action = AFragmentDirections.openFragmentB()
findNavController().navigate(action)
viewModel.openFragmentB.value=null
}
但是对于更好的方法,您可以阅读有关SingleLIveEvent的信息: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150