我正在使用伴奏者的JetPack撰写页面,我想知道我如何确切地知道我的页面何时显示在屏幕上。像onPageSelected
下面是我的代码:HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.background)
) { page ->
// This method reinvoked many times.
}
因为当前每次重组都会从Pager调用那个回调方法。
我觉得用
比较好LaunchedEffect(pagerState) {
snapshotFlow { pagerState.currentPage }.collect { page ->
// do your stuff with selected page
}
}
要完成@ ysfcyn解决方案,请参阅官方文档:
https://google.github.io/accompanist/pager/reacting-to-page-changes
完整的例子是:
val pagerState = rememberPagerState()
LaunchedEffect(pagerState) {
// Collect from the a snapshotFlow reading the currentPage
snapshotFlow { pagerState.currentPage }.collect { page ->
AnalyticsService.sendPageSelectedEvent(page)
}
}
VerticalPager(
count = 10,
state = pagerState,
) { page ->
Text(text = "Page: $page")
}
这是我的解决方案,对我来说很有效。额外的内容是"distinctUntilChanged">
LaunchedEffect(pagerState) {
snapshotFlow {
pagerState.currentPage
}.distinctUntilChanged().collect { page ->
// Now you can use selected page
onPageChangeListener.invoke(page)
}
}
这是一个比官方文档
更简单的解决方案。LaunchedEffect(pagerState.currentPage) {
// do your stuff with pagerState.currentPage
}
使用一个变量来跟踪
val trigger by remember { mutableStateOf (false) }
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.background)
) { page ->
// Shown successfully,
trigger = true //use at other places as a callback to change state
}
我们可以使用PagerState
来完成我们的任务,而不需要任何回调。
val pagerState = rememberPagerState(pageCount = list.size)
HorizontalPager(state = pagerState) { page ->
// Our page content
CardItemView(page, list[page])
}
// Do your tasks based on the current page selected using pagerState.currentPage
Toast.makeText(
LocalContext.current,
"Page selected ${pagerState.currentPage}",
Toast.LENGTH_SHORT
).show()