pull/1553/merge
Rodrigo 2 days ago committed by GitHub
commit 092598eeac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -74,6 +74,19 @@ internal fun itemVisibilityPercentage(
viewportEndOffset: Int,
): Float {
if (itemSize == 0) return 0f
// TODO: Workaround due to issue b/353143657, monitor if compose team will agree it's an issue
// and fix it, if so, below safeguard probably can be removed
if (
isItemOutOfViewport(
itemSize = itemSize,
itemStartOffset = itemStartOffset,
viewportStartOffset = viewportStartOffset,
viewportEndOffset = viewportEndOffset,
)
) {
return 0f
}
val itemEnd = itemStartOffset + itemSize
val startOffset = when {
itemStartOffset > viewportStartOffset -> 0
@ -86,3 +99,28 @@ internal fun itemVisibilityPercentage(
val size = itemSize.toFloat()
return (size - startOffset - endOffset) / size
}
private fun isItemOutOfViewport(
itemSize: Int,
itemStartOffset: Int,
viewportStartOffset: Int,
viewportEndOffset: Int,
) = isItemBeforeViewport(
itemSize = itemSize,
itemStartOffset = itemStartOffset,
viewportStartOffset = viewportStartOffset,
) || isItemAfterViewport(
itemStartOffset = itemStartOffset,
viewportEndOffset = viewportEndOffset,
)
private fun isItemBeforeViewport(
itemSize: Int,
itemStartOffset: Int,
viewportStartOffset: Int,
) = (viewportStartOffset - itemStartOffset) > itemSize
private fun isItemAfterViewport(
itemStartOffset: Int,
viewportEndOffset: Int,
) = itemStartOffset > viewportEndOffset

@ -115,7 +115,10 @@ fun LazyGridState.scrollbarState(
val firstIndex = min(
a = interpolateFirstItemIndex(
visibleItems = visibleItemsInfo,
visibleItems = when (layoutInfo.orientation) {
Orientation.Vertical -> layoutInfo.visibleItemsInfo.filter { it.row == 0 }
Orientation.Horizontal -> layoutInfo.visibleItemsInfo.filter { it.column == 0 }
},
itemSize = { layoutInfo.orientation.valueOf(it.size) },
offset = { layoutInfo.orientation.valueOf(it.offset) },
nextItemOnMainAxis = { first ->
@ -189,7 +192,7 @@ fun LazyStaggeredGridState.scrollbarState(
val firstIndex = min(
a = interpolateFirstItemIndex(
visibleItems = visibleItemsInfo,
visibleItems = layoutInfo.visibleItemsInfo.filter { it.lane == 0 },
itemSize = { layoutInfo.orientation.valueOf(it.size) },
offset = { layoutInfo.orientation.valueOf(it.offset) },
nextItemOnMainAxis = { first ->

Loading…
Cancel
Save