JetPack Compose Pager 的 onPageSelected 回调

onPageSelected callback for JetPack Compose Pager

我正在使用 Accompanist 的 JetPack Compose Pager,我想知道我如何才能准确知道我的页面何时显示在屏幕上。喜欢 ViewPager 中的 onPageSelected 方法。

这是我的代码:

HorizontalPager(
        state = pagerState,
        modifier = Modifier
            .fillMaxSize()
            .background(MaterialTheme.colors.background)
    ) { page ->
         // This method reinvoked many times.

      }

'因为目前每次重组都会从寻呼机调用该回调方法。

使用变量进行跟踪

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
      }

我觉得用起来会更好

LaunchedEffect(pagerState) {
    snapshotFlow { pagerState.currentPage }.collect { page ->
        // do your stuff with selected page
    }
}

要完成@ysfcyln 的解决方案,这里是官方文档:

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")
}

我们可以使用 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()