为什么HorizontalPager 的自动滚动在手动滚动后就停止了?
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) {
// ...
}
}
我认为第二种解决方案更清晰,因为在这种情况下计时器将重新启动,并延迟到下一次滚动将始终相同。
我有一个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) {
// ...
}
}
我认为第二种解决方案更清晰,因为在这种情况下计时器将重新启动,并延迟到下一次滚动将始终相同。