Compose 延遲列表踩過的坑

SharpCJ發表於2024-06-27

問題

在使用 Jetpack Compose 延遲列表時遇到一個坑,簡單記錄一下。直接上程式碼:


這個程式碼看起來也沒有什麼問題,滑動正常,點選滑動到頂部也正常。
但是極端操作:在一邊滑動列表一邊點選按鈕,就出問題了。這樣再點選按鈕,就不生效了。從日誌來看,點選時協程發射值沒有問題,但是 collect 不執行了。

如果直接在點選事件中啟動協程,執行操作,就不會有問題。

Button(onClick = {
    scope.launch {
        state.animateScrollToItem(0)
    }
}){

}

那問題出現在哪裡了呢?

實際上是,在點選按鈕是,執行滾動的動畫,同時,手滑列表,會丟擲動畫中斷的異常,沒有處理的話,會把導致 flow 的 collect 出現問題。
解決辦法:

LaunchedEffect(Unit) {
    viewModel.scrollToTop.collect {
        runCatching {
            state.animateScrollToItem(0)
        }
    }
}

總結

最後總結一下,這個問題類似的情況還會有很多,其實不在於 Compose, 而是協程的異常處理。後續如果遇到協程上游正常發生值之後,下游收集出現問題,要想到出現異常的情況。最佳方案是在下游需要對可能發生的異常進行及時處理。

相關文章