导航DESTINATION_NAME不知道此NavController,之前使用navController.popBackStack()关闭的ReOpening片段?

问题描述 投票:5回答:2

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

主要信息

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)

android android-architecture-components android-jetpack android-architecture-navigation
2个回答
0
投票

之前的值可能仍然存在于视图模型中并立即触发。我建议使用一个接口来处理你的后退按钮委托而不是一个观察者。这应该修复用法。

发生了什么事情是你在后面的堆栈中弹出太远到你没有活动图表的程度。这种情况正在发生,因为你的观察者被触发的频率超过了应有的频率。为了看到这一点,我建议调试该行并在崩溃前检查图表。它很可能是空的。


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

现在我的代码运行正常

© www.soinside.com 2019 - 2024. All rights reserved.