Android 导航目标_名称对此NavController未知,是否重新打开以前使用NavController.popBackStack()关闭的片段?

Android 导航目标_名称对此NavController未知,是否重新打开以前使用NavController.popBackStack()关闭的片段?,android,android-architecture-components,android-jetpack,android-architecture-navigation,Android,Android Architecture Components,Android Jetpack,Android Architecture Navigation,我正在我的应用程序中使用导航组件,最近它工作正常,但在将项目更新为AndroidX后,我收到错误导航目的地\u此导航控制器不知道该目的地的名称(我将打开该目的地)以前使用navController.popBackStack()从自身关闭。另外,如果我从MainActivity关闭目标片段,则不会出现错误,但只有当使用popBackStack从自身关闭目标片段时,才会出现错误。如下 目的片段 主要活动 我也检查了相关问题,但没有帮助 注意:我使用的是最新版本的导航库(alpha05)以前的值可能仍

我正在我的应用程序中使用导航组件,最近它工作正常,但在将项目更新为
AndroidX
后,我收到错误
导航目的地\u此导航控制器不知道该目的地的名称
(我将打开该目的地)以前使用
navController.popBackStack()
从自身关闭。另外,如果我从
MainActivity
关闭目标片段,则不会出现错误,但只有当使用
popBackStack
从自身关闭目标片段时,才会出现错误。如下

目的片段

主要活动

我也检查了相关问题,但没有帮助


注意:我使用的是最新版本的导航库(alpha05)

以前的值可能仍然存在于视图模型中,并且正在立即触发。我建议使用一个界面来处理后退按钮委托,而不是使用观察者。这应该可以解决这个问题

发生的情况是,您在后堆栈中弹出的位置太远,以至于不再有活动图形。这是因为你的观察者被触发的频率比它应该的要高。要了解这一点,我建议在崩溃之前调试该行并检查图形。它很可能是空的。

我在DestinationFragment中使用它来观察MainActivity的反压,因为我在问题中已经提到了这一点。所以问题出在
SingleLiveEvent
中,我注意到我不小心将
fun-observe(所有者:生命周期所有者,观察者:观察者)的代码更改为

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*//})
}

现在我的代码运行良好

我也遇到了同样的问题。在我的应用程序中有三个片段
A->B->C
,我必须从
C
返回
A
。在我的例子中,我使用了
popBackStack()
关闭当前片段并返回到上一个片段,在此之后,任何从
A
抛出的
Navigation xxx导航的尝试对此NavController
异常是未知的

我最终使用
navigate()
A
而不是从后堆栈中弹出片段。使用
popUpTo
popuptinclusive
设置正确修复了问题(参见文档)


我用这种方式

@Override
public void onBackPressed() {

 if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
 /** do something */
 else myNavController.popBackStack();

}
我用的是只触发一次的
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*//})
}
@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*//})
}  
<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>
@Override
public void onBackPressed() {

 if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
 /** do something */
 else myNavController.popBackStack();

}