Я создаю приложение, используя Jetpack Compose HorizontalPager. Пейджер можно прокручивать с помощью кнопки и перелистывая страницы. Когда пейджер прокручивается с помощью нажатия кнопки, я выполнял дополнительные действия, например, записывал индекс текущей страницы, как показано в коде ниже. Но сообщение не логируется при перелистывании страниц. Я хочу знать, как я могу добиться выполнения дополнительных действий при перелистывании страниц, чтобы синхронизировать их с тем, что происходит при прокрутке с помощью кнопки. Вот мой код
private const val TAG = "TAGG"
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun PagerDemo(){
val scope = rememberCoroutineScope()
val state = rememberPagerState{5}
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Button(onClick = {
scope.launch{
state.scrollToPage(state.currentPage - 1)
Log.d(TAG, "${state.currentPage}")
}
}) {
Text(text = "Backward")
}
Spacer(modifier = Modifier.width(12.dp))
Button(onClick = {
scope.launch{
state.scrollToPage(state.currentPage + 1)
Log.d(TAG, "${state.currentPage}")
}
}) {
Text(text = "Forward")
}
}
HorizontalPager(
state = state,
key = {state.currentPage},
pageSize = PageSize.Fill,
){
Box(
modifier = Modifier.fillMaxSize()
.background(Color.Cyan),
contentAlignment = Alignment.Center,
){
Text(
text = "$it",
fontSize = 64.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
)
}
}
}
}
Спасибо
@MAshhal Я добавил код. Я хочу знать, где я могу добавить код для выполнения дополнительных действий при перелистывании страниц или программной прокрутке с помощью нажатия кнопки.
Вы можете попробовать использовать LaunchedEffect. Это позволяет вызывать побочные эффекты при каждом изменении ключевой переменной. В вашем случае вы можете попробовать использовать его следующим образом:
val state = rememberPagerState{5}
LaunchedEffect(state.settledPage) {
Log.d(TAG, "${state.currentPage}")
}
Мы наблюдаем атрибут SustainablePage из [PagerState][3]
. Он представляет индекс текущей урегулированной страницы, то есть индекс страницы после завершения анимации прокрутки. Всякий раз, когда settledPage
изменяется, LaunchedEffect
будет выполняться.
Это произойдет как в случае, если прокрутка была активирована программно, так и с помощью жеста смахивания. Таким образом, вы можете удалить оператор Log.d()
со своей кнопки.
Если вместо этого вы хотите распечатать журнал, когда анимация прокрутки все еще продолжается, используйте вместо этого currentPage.
Спасибо @BenjyTec за подробное объяснение и пример кода. Это решило мою проблему на данный момент. Но я подумал, может ли быть другое решение этой проблемы. Я реализовал предложенное вами решение. Спасибо
Вы не выложили код