Closed zhushenwudi closed 3 years ago
测试一下,并没有重现你所说的情况啊
@hegaojian 可以这么测试,列表同时点击两个,就会崩溃的。
这种情况可以针对 NavController 添加一系列的扩展方法,其实就是重写各个 NavController#navigation 方法,添加 try catch, 因为 NavController 很蠢,没办法判断有没有 destination.
可以的,我先加上吧,虽然按照你说的方法测试 列表同时点击两个 还是没有出现崩溃,但是还是加上靠谱点 @ParadiseHell
@hegaojian 同时点击列表 Item, 好像 RecyclerView 有个设置,就可以避免两次同时点击只有一个点击生效,如果两个点击事件都触发了,就会调用 navigation 两次,这种情况就会崩溃。
@hegaojian 其实就是 navigation 路由已经跳转了。但是第二次又被调用导致from为空,崩溃
当时就是因为这个崩溃问题,我才写了这个拓展函数,限制0.5秒内不能重复点击解决这个bug,按理来说不应该再触发崩溃错误了
嗯,我懂你。但是写程序的时候可能注意不到这些,或者有一些特殊情况会跳过你得方法。还是加上 try 稳定
嗯嗯,感谢你的建议,先加上吧,稳健一点 :satisfied:
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