为什么Horizo​​ntalPager 的自动滚动在手动滚动后就停止了?

Why does HorizontalPager's automatic scrolling stop after manual scrolling?

我有一个HorizontalPager

val pageCount = bannerList.size
val startIndex = Int.MAX_VALUE / 2
val pagerState = rememberPagerState(initialPage = 100)
HorizontalPager(
    count = Int.MAX_VALUE,
    state = pagerState,
    contentPadding = PaddingValues(
        horizontal = 20.dp
    ),
    modifier = Modifier
        .fillMaxWidth()
) { index ->
// content goes here
}

我让它每 4 秒滚动一次,就像带有 LaunchedEffect

的横幅一样
LaunchedEffect(
    key1 = Unit,
    block = {
        repeat(
            times = Int.MAX_VALUE,
            action = {
                delay(
                    timeMillis = 4000
                )
                pagerState.animateScrollToPage(
                    page = pagerState.currentPage + 1
                )
            }
        )
    })

它每 4 秒滚动一次,但是当我手动滚动它时 HorizontalPager 停止滚动!

有什么解决方法的建议吗?

animateScrollToPage 在手动滚动期间调用时抛出异常:

java.util.concurrent.CancellationException: Current mutation had a higher priority

您可以通过多种方式解决。例如只捕获异常并忽略它:

delay(
    timeMillis = 4000
)
try {
    pagerState.animateScrollToPage(
        page = pagerState.currentPage + 1
    )
} catch (_: Throwable) {
}

另一种选择是检查寻呼机是否正在被拖动并停止您的 LaunchedEffect 这段时间:

val isDragged by pagerState.interactionSource.collectIsDraggedAsState()
if (!isDragged) {
    LaunchedEffect(Unit) {
        // ...
    }
}

我认为第二种解决方案更清晰,因为在这种情况下计时器将重新启动,并延迟到下一次滚动将始终相同。