Navigation:DialogFragment执行dismiss/popBackStack 后使用previousBackStackEntry传值后跳转新Fragment报错

直接贴出报错内容:java.lang.IllegalArgumentException

D/ATestFragment:java.lang.IllegalArgumentException: 
Navigation action/destination(id/action_aTestFragment_to_bTestFragment) cannot be found from the current destination Destination(id/testDialogFragment) label=TestDialogFragment  

报错内容理解为:从当前的 destination(DislogFragment)找不到 Navigation action [从 ATestFragment 导航(跳转)到 BTestFragment]。

一个跳转怎么会找不到呢,这里继续贴上关键代码:

在DislogFragment 执行方法:

    private fun savedStateHandleResult(type: ConnectivityType) {
        val navController = findNavController()
        with(navController) {
            dismiss()
            previousBackStackEntry?.savedStateHandle?.set(RESULT, type)
        }
    }

然后在ATestFragment监听 savedStateHandle 值,然后跳转至BTestFragment:

     private fun addConnectivitySavedStateHandleCallback() {
        val savedStateHandle = findNavController().currentBackStackEntry?.savedStateHandle
        val result =
            savedStateHandle?.getLiveData<ConnectivityType>(RESULT)
        result?.observe(viewLifecycleOwner, {
            when (it) {
                ConnectivityType.PROMPT_TYPE_NETWORK_CONNECTED -> {
                    savedStateHandle?.remove<ConnectivityType>(RESULT)
                    findNavController().navigate(R.id.action_aTestFragment_to_bTestFragment)
                }
            }
        })
    }

这看起来没有问题,运行起来就会报错(开头已贴出来),根据报错,可以知道在调用完 dismiss() , 然后给 previousBackStackEntry?.savedStateHandle 赋值,ATestFragment 也监听到 savedStateHandle 值,然后也执行了导航至BTestFragment 的方法, 但这时候提示当前的 destination 仍然为DislogFragment,还是有点奇怪的。不过既然这样写法不行,我想着换成 popBackStack(), 如下:

    private fun savedStateHandleResult(type: ConnectivityType) {
        val navController = findNavController()
        with(navController) {
            popBackStack()
            previousBackStackEntry?.savedStateHandle?.set(RESULT, type)
        }
    }

这样却发现 ATestFragment 监听不到 savedStateHandle 值,这就奇怪了,然后就去查原因,各种调试,看源码;过程很苦逼哈!

最后我也整理了一篇文章来说明(欢迎查看):
Navigation: DialogFragment popBackStack() 和 dismiss() 比较currentBackStackEntry/previousBackStackEntry

然后会豁然开朗,原因是dismiss和popBackStack执行后是有区别的:(截取上篇文章中的片段)

对于一个有延迟性(dismiss),一个是及时性(popBackStack),所以解决方式呼之欲出:

    private fun savedStateHandleResult(type: ConnectivityType) {
        val navController = findNavController()
        with(navController) {
            popBackStack()
            // 将“ previousBackStackEntry”替换为“ currentBackStackEntry”:
            // 用于从DialogFragment返回到Fragment后直接导航到新的Fragment。
            // 它将包含与目标相对应的DialogFragment,并且不会在backStack中及时清除,
            // 并且将报告:IllegalArgumentException:无法从当前目标位置找到导航操作/目标。
            currentBackStackEntry?.savedStateHandle?.set(RESULT, type)
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Avoided redundant navigation to current location: '/home/editEmp'" 是一个错误信息,意味着你试图导航到当前已经处于的位置。这个错误通常在你尝试在路由器中使用相同的路径进行导航时发生。举个例子,如果你当前已经处于"/home/editEmp"这个页面,然后再次尝试导航到相同的路径"/home/editEmp",就会出现这个错误。这个错误信息的目的是防止无限导航循环。为了解决这个问题,你可以在导航之前先判断当前路径是否和要导航的路径相同,如果相同则不进行导航。引用、和中提到了一种解决方法,即在导航之前使用条件判断来避免重复导航。例如,在Vue.js中,你可以使用以下代码来解决这个问题: ``` if (this.$route.path !== '/home/editEmp') { this.$router.push('/home/editEmp'); } ``` 这样,在导航到"/home/editEmp"之前,先判断当前路径是否为"/home/editEmp",如果不是,再进行导航。这样就可以避免重复导航的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [重复导航问题:Avoided redundant navigation to current location: “/login“.](https://blog.csdn.net/qq_64725840/article/details/131667417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [报错:Avoided redundant navigation to current location: “/login“.完美解决](https://blog.csdn.net/Father_Of_Soft/article/details/129846279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值