Compose 延迟列表踩过的坑
问题
在使用 Jetpack Compose 延迟列表时遇到一个坑,简单记录一下。直接上代码:
这个代码看起来也没有什么问题,滑动正常,点击滑动到顶部也正常。
但是极端操作:在一边滑动列表一边点击按钮,就出问题了。这样再点击按钮,就不生效了。从日志来看,点击时协程发射值没有问题,但是 collect 不执行了。
如果直接在点击事件中启动协程,执行操作,就不会有问题。
Button(onClick = {
scope.launch {
state.animateScrollToItem(0)
}
}){
}
那问题出现在哪里了呢?
实际上是,在点击按钮是,执行滚动的动画,同时,手滑列表,会抛出动画中断的异常,没有处理的话,会把导致 flow 的 collect 出现问题。
解决办法:
LaunchedEffect(Unit) {
viewModel.scrollToTop.collect {
runCatching {
state.animateScrollToItem(0)
}
}
}
总结
最后总结一下,这个问题类似的情况还会有很多,其实不在于 Compose, 而是协程的异常处理。后续如果遇到协程上游正常发生值之后,下游收集出现问题,要想到出现异常的情况。最佳方案是在下游需要对可能发生的异常进行及时处理。