导航DESTINATION_NAME对于此NavController未知,是否正在重新打开以前使用navController.popBackStack()关闭的片段?

时间:2018-08-17 03:22:52

标签: android android-architecture-components android-jetpack android-architecture-navigation

我正在我的应用程序中使用导航组件,最近它可以正常工作,但是将项目更新为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)

4 个答案:

答案 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而不是从后堆栈中弹出的片段。使用popUpTopopUpToInclusive设置可以正确解决此问题(请参阅文档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();

}