11

我在我的应用程序中使用导航组件,最近它工作正常,但是在将项目更新到之后,只有当该目的地(AndroidXnavigation destination DESTINATION_NAME is unknown to this NavController 要打开的)之前使用navController.popBackStack(). 此外,如果我从 关闭 DESTINATION 片段也没有错误MainActivity,但仅发生错误片段是使用popBackStack. 像下面

目标片段

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

主要活动

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
    }
}

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

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

4

4 回答 4

0

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

正在发生的事情是您在后台堆栈中弹出太远,以至于您不再有活动图。发生这种情况是因为您的观察者被触发的频率超出了预期。要看到这一点,我建议在崩溃之前调试该行并检查图表。它很可能为空。

于 2018-08-17T11:53:18.957 回答
0

我在 DestinationFragment中使用SingleLiveEvent来观察MainActivity的后压,因为我已经在我的问题中提到了这一点。所以问题出在我注意到我不小心将代码更改为 SingleLiveEventfun 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*//})
}  

现在我的代码工作正常

于 2018-08-30T12:14:07.160 回答
0

我遇到过同样的问题。在我的应用程序中有三个片段A -> B -> C,我不得不返回Afrom C。在我的情况下,我曾经popBackStack()关闭当前片段并返回到前一个片段,之后任何尝试从A抛出的Navigation xxx is unknown to this NavController异常导航。

我最终使用navigate()toA而不是从后堆栈弹出片段。使用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>
于 2019-07-23T08:16:27.243 回答
0

我用这种方式

@Override
public void onBackPressed() {

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

}
于 2019-11-18T05:41:02.580 回答