fix: immediately scrolling

This commit is contained in:
2026-09-18 01:25:00 +03:00
parent d17c70e871
commit b1418f79da
@@ -323,33 +323,37 @@ private fun DayChips(
LaunchedEffect(pagerState, days) { LaunchedEffect(pagerState, days) {
snapshotFlow { snapshotFlow {
pagerState.settledPage pagerState.currentPage
}.collectLatest { targetPage -> }.collectLatest { targetPage ->
if (targetPage in days.indices) { if (targetPage in days.indices) {
val layoutInfo = listState.layoutInfo val layoutInfo = listState.layoutInfo
var visibleItems = layoutInfo.visibleItemsInfo val visibleItems = layoutInfo.visibleItemsInfo
var targetItem = visibleItems.firstOrNull { it.index == targetPage } val targetItem = visibleItems.firstOrNull { it.index == targetPage }
if (targetItem == null) {
listState.scrollToItem(index = targetPage)
val updatedLayout = listState.layoutInfo
visibleItems = updatedLayout.visibleItemsInfo
targetItem = visibleItems.firstOrNull { it.index == targetPage }
}
if (targetItem != null) { if (targetItem != null) {
val visiblePercentage = getVisiblePercentage(targetItem, layoutInfo) val visiblePercentage = getVisiblePercentage(targetItem, layoutInfo)
val minVisibleThreshold = 0.75f val minVisibleThreshold = 0.9f
if (visiblePercentage < minVisibleThreshold) { if (visiblePercentage < minVisibleThreshold) {
val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset
val halfViewport = viewPortWidth / 2f val halfViewport = viewPortWidth / 2f
val centerOffset = (halfViewport - (targetItem.size / 2f) - paddingPx).toInt() val centerOffset = (halfViewport - (targetItem.size / 2f) - paddingPx).toInt()
listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset)
}
} else {
val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset
val halfViewport = viewPortWidth / 2f
val averageSize = visibleItems.map { it.size }.average().toInt().coerceAtLeast(150)
val centerOffset = (halfViewport - (averageSize / 2f) - paddingPx).toInt()
listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset) listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset)
} }
} }
} }
} }
}
LazyRow(state = listState, horizontalArrangement = Arrangement.spacedBy(6.dp), contentPadding = PaddingValues(horizontal = hPadding, vertical = 2.dp),) { LazyRow(state = listState, horizontalArrangement = Arrangement.spacedBy(6.dp), contentPadding = PaddingValues(horizontal = hPadding, vertical = 2.dp),) {
items(days, key = { it.date.toEpochDay() }) { day -> items(days, key = { it.date.toEpochDay() }) { day ->