Как синхронизировать перелистывание и прокрутку при нажатии кнопок составного HorizontalPager

Я создаю приложение, используя 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,
                )
            }
        }


    }
}

Спасибо

Вы не выложили код

M Ashhal 04.04.2024 02:33

@MAshhal Я добавил код. Я хочу знать, где я могу добавить код для выполнения дополнительных действий при перелистывании страниц или программной прокрутке с помощью нажатия кнопки.

unique_iyke 04.04.2024 10:37
0
2
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать использовать LaunchedEffect. Это позволяет вызывать побочные эффекты при каждом изменении ключевой переменной. В вашем случае вы можете попробовать использовать его следующим образом:

val state = rememberPagerState{5}
LaunchedEffect(state.settledPage) {
    Log.d(TAG, "${state.currentPage}")
}

Мы наблюдаем атрибут SustainablePage из [PagerState][3]. Он представляет индекс текущей урегулированной страницы, то есть индекс страницы после завершения анимации прокрутки. Всякий раз, когда settledPage изменяется, LaunchedEffect будет выполняться.
Это произойдет как в случае, если прокрутка была активирована программно, так и с помощью жеста смахивания. Таким образом, вы можете удалить оператор Log.d() со своей кнопки.

Если вместо этого вы хотите распечатать журнал, когда анимация прокрутки все еще продолжается, используйте вместо этого currentPage.

Спасибо @BenjyTec за подробное объяснение и пример кода. Это решило мою проблему на данный момент. Но я подумал, может ли быть другое решение этой проблемы. Я реализовал предложенное вами решение. Спасибо

unique_iyke 05.04.2024 13:17

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