我正在我的应用程序中使用导航组件,最近它可以正常工作,但是将项目更新为AndroidX
后,我会收到错误消息navigation destination DESTINATION_NAME is unknown to this NavController
,仅当该目标位置(我要打开)之前已使用navController.popBackStack()
从自身关闭。另外,如果我从MainActivity
关闭DESTINATION片段也没有错误,但是使用popBackStack
会从自身关闭只发生错误的片段。像下面的
DestinationFragment
viewModelOfActivity.handleBackButton.observe(this, Observer {
Navigation.findNavController(requireActivity(), R.id.main_nav_host).popBackStack()
//CALLING popBackStack() HERE CAUSING PROBLEM WHEN REOPNING THIS DESTINATION(or frg ) AGIAN
})
MainActivity
override fun onBackPressed() {
if (myViewModel.isDefaultBehaviour.value == true) {
super.onBackPressed()
} else{
myViewModel.handleBackButton.value=true
//NO ERROR IF HANDLE BACK BUTTON HERE ie->findNavController(R.id.main_nav_host).popBackStack()
//INSTEAD OF myViewModel.handleBackButton
}
}
我还检查了相关的问题,但没有帮助Similar Question。
注意:我正在使用最新版本的导航库(alpha05)
答案 0 :(得分:0)
先前的值可能仍存在于视图模型中,并立即触发。我建议使用界面而不是观察者来处理后退按钮委托。那应该可以解决用法。
正在发生的事情是,您在后堆栈中弹出的位置太远,以至于不再有活动图形。之所以发生这种情况,是因为您的观察者被触发的次数比预期的要多。要看到这一点,我建议调试该行并在崩溃前检查图表。可能为空。
答案 1 :(得分:0)
我在 DestinationFragment 中使用SingleLiveEvent来观察 MainActivity 中的回压,因为我已经在问题中提到了这一点。因此问题出在SingleLiveEvent
中,我注意到我不小心将fun observe(owner: LifecycleOwner, observer: Observer<in T>)
的代码更改为
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, observer)//Here is problem I was calling super twice in function
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
在这里您可以看到我两次调用super
函数,该函数在onChanged
中两次调用了观察者的Fragment
,下面的代码被两次调用了
Navigation.findNavController(requireActivity(), R.id.main_nav_host).popBackStack()
popBackStack()
两次。
然后,我更改了observe
函数,如下所示
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
现在我的代码可以正常工作
答案 2 :(得分:0)
我有同样的问题。在我的应用中,有三个片段A -> B -> C
,我不得不从A
返回到C
。在我的情况下,我使用popBackStack()
关闭当前片段并返回上一个片段,此后从A
导航的任何尝试都抛出了Navigation xxx is unknown to this NavController
异常。
我最终使用了navigate()
到A
而不是从后堆栈中弹出的片段。使用popUpTo
和popUpToInclusive
设置可以正确解决此问题(请参阅文档https://developer.android.com/guide/navigation/navigation-getting-started#popupto_example_circular_logic)
<fragment
android:id="@+id/FragmentC"
android:name="xxx.FragmentC"
android:label="C" >
<action
android:id="@+id/action_to_A"
app:destination="@id/FragmentA"
app:popUpTo="@+id/FragmentA"
app:popUpToInclusive="true" />
</fragment>
答案 3 :(得分:0)
我正以这种方式使用
@Override
public void onBackPressed() {
if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
/** do something */
else myNavController.popBackStack();
}