onPageSelected обратный вызов для JetPack Compose Pager

Я использую пейджер JetPack Compose Pager от аккомпаниатора, и мне интересно, как я могу точно узнать, когда моя страница отображается на экране. Как onPageSelected методом из ViewPager.

Вот мой код:

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

      }

Потому что в настоящее время каждая перекомпоновка будет вызывать этот метод обратного вызова из пейджера.

7 ответов

Думаю лучше будет использовать

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

Чтобы завершить решение @ysfcyln, вот официальная документация:

https://google.github.io/accompanist/pager/#реакция-на-страницу-изменения

полный пример есть:

      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
}

Мы можем выполнять наши задачи без каких-либо обратных вызовов, используя 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()

Используйте переменную для отслеживания

      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, чтобы узнать, когда ваша страница будет успешно показана.

      HorizontalPager(
    state = pagerState,
    modifier = Modifier.fillMaxSize()
) { page ->
     LaunchedEffect(key1 = page, block = {
       if (!pagerState.isScrollInProgress) {
          // Here you are
       }
     })
  }

LaunchedEffect вызывается только один раз для каждой клавиши (которая является текущей страницей). Итак, с помощью этого кода вы можете реализовать функцию onPageSelected.

Другие вопросы по тегам