hegaojian / JetpackMvvm

:chicken::basketball:一个Jetpack结合MVVM的快速开发框架,基于MVVM模式集成谷歌官方推荐的JetPack组件库:LiveData、ViewModel、Lifecycle、Navigation组件 使用Kotlin语言,添加大量拓展函数,简化代码 加入Retrofit网络请求,协程,帮你简化各种操作,让你快速开发项目
https://github.com/hegaojian/JetpackMvvm
Apache License 2.0
3.13k stars 610 forks source link

navigation切换fragment时 快速点击可能会崩溃 #53

Closed zhushenwudi closed 3 years ago

zhushenwudi commented 3 years ago

me.hgj.jetpackmvvm.ext.NavigationExt 中 NavController.navigateAction方法建议改为以下代码:

fun NavController.navigateAction(resId: Int, bundle: Bundle? = null, interval: Long = 500) { val currentTime = System.currentTimeMillis() if (currentTime >= lastTapTime + interval) { lastTapTime = currentTime try { navigate(resId, bundle) } catch (ignore: Exception) {} } }

当 fragment 中 action 的 duration设置为 0 时,连续点击两个不同的跳转会导致如下崩溃:

java.lang.IllegalArgumentException: Navigation action/destination com.xxx.xxx:id/action_aFragment_to_bFragment cannot be found from the current destination Destination(com.xxx.xxx:id/cFragment) label=cFragment class=com.xxx.xxx.ui.fragment.cFragment

hegaojian commented 3 years ago

测试一下,并没有重现你所说的情况啊

ParadiseHell commented 3 years ago

@hegaojian 可以这么测试,列表同时点击两个,就会崩溃的。

ParadiseHell commented 3 years ago

这种情况可以针对 NavController 添加一系列的扩展方法,其实就是重写各个 NavController#navigation 方法,添加 try catch, 因为 NavController 很蠢,没办法判断有没有 destination.

hegaojian commented 3 years ago

可以的,我先加上吧,虽然按照你说的方法测试 列表同时点击两个 还是没有出现崩溃,但是还是加上靠谱点 @ParadiseHell

ParadiseHell commented 3 years ago

@hegaojian 同时点击列表 Item, 好像 RecyclerView 有个设置,就可以避免两次同时点击只有一个点击生效,如果两个点击事件都触发了,就会调用 navigation 两次,这种情况就会崩溃。

zhushenwudi commented 3 years ago

@hegaojian 其实就是 navigation 路由已经跳转了。但是第二次又被调用导致from为空,崩溃

hegaojian commented 3 years ago

当时就是因为这个崩溃问题,我才写了这个拓展函数,限制0.5秒内不能重复点击解决这个bug,按理来说不应该再触发崩溃错误了

zhushenwudi commented 3 years ago

嗯,我懂你。但是写程序的时候可能注意不到这些,或者有一些特殊情况会跳过你得方法。还是加上 try 稳定

hegaojian commented 3 years ago

嗯嗯,感谢你的建议,先加上吧,稳健一点 :satisfied: