[英]How to react to to user scrolling on Accompanist Pager?
Accompanist Pager 文档建议对页面更改做出如下反应:
val pagerState = rememberPagerState()
LaunchedEffect(pagerState) {
// Collect from the pager state a snapshotFlow reading the currentPage
snapshotFlow { pagerState.currentPage }.collect { page ->
AnalyticsService.sendPageSelectedEvent(page)
}
}
VerticalPager(
count = 10,
state = pagerState,
) { page ->
Text(text = "Page: $page")
}
我们如何区分滚动到页面和用户手势,以及使用animateScrollingToPage()
/ scrollingToPage()
滚动到页面? 我只想在用户滚动时执行某个操作,而不是在程序滚动上执行。
你试过了吗:
val isScrollInProgressFlow = snapshotFlow { pagerState.isScrollInProgress }
我有一个类似的问题,我使用interactionsSource解决了它。 发生自动滚动时不会发出任何交互。 但它会发出对用户操作的交互。
您还可以使用其他交互源类型。
LaunchedEffect(Unit) {
pagerState.interactionSource.interactions
.collect {
if (it is DragInteraction.Start) {
Log.d("test", "User interaction is started")
}
}
}
在我的例子中,我不得不取消用户拖动时的自动滚动。 简化版本如下所示:
LaunchedEffect(Unit) {
val autoscrollJob = launch {
while(true) {
yield() // exit the coroutine if the job is completed
delay(autoScrollDelay)
animateScrollToPage(
page = (currentPage + 1) % pageCount
)
}
}
launch {
interactionSource.interactions
.collect {
if (it is DragInteraction.Start) {
autoscrollJob.cancel()
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.