From 2312e9c806dcc25890d40eaaf981d75a52e24406 Mon Sep 17 00:00:00 2001 From: Damir Dautov Date: Wed, 2 Jun 2021 13:36:01 +0500 Subject: [PATCH] Bounce effect workaround --- .../lib/src/viewport.dart | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/scrollable_positioned_list/lib/src/viewport.dart b/packages/scrollable_positioned_list/lib/src/viewport.dart index 1de5ff05..357bf902 100644 --- a/packages/scrollable_positioned_list/lib/src/viewport.dart +++ b/packages/scrollable_positioned_list/lib/src/viewport.dart @@ -231,10 +231,36 @@ class UnboundedRenderViewport extends RenderViewport { _maxScrollExtent = 0.0; _hasVisualOverflow = false; + final RenderSliver? leadingNegativeChild = childBefore(center!); + final RenderSliver? trailingPositiveChild = childAfter(center!); + final double leadingOffset = (leadingNegativeChild != null + ? leadingNegativeChild.geometry?.scrollExtent ?? 0 + : 0); + final double trailingOffset = (trailingPositiveChild != null + ? trailingPositiveChild.geometry?.scrollExtent ?? 0 + : 0); + final double centerBodyOffset = + (center != null ? center!.geometry?.scrollExtent ?? 0 : 0); + // centerOffset is the offset from the leading edge of the RenderViewport // to the zero scroll offset (the line between the forward slivers and the // reverse slivers). - final double centerOffset = mainAxisExtent * anchor - correctedOffset; + double centerOffset = mainAxisExtent * anchor - correctedOffset; + if (leadingOffset + centerBodyOffset + trailingOffset > 0) { + if (leadingOffset + centerBodyOffset + trailingOffset < mainAxisExtent) { + centerOffset = math.max( + leadingOffset, + mainAxisExtent * anchor - centerBodyOffset - trailingOffset, + ); + } else { + centerOffset = centerOffset.clamp( + mainAxisExtent - centerBodyOffset - trailingOffset, + leadingOffset + + (leadingOffset > mainAxisExtent ? mainAxisExtent * anchor : 0), + ); + } + } + final double reverseDirectionRemainingPaintExtent = centerOffset.clamp(0.0, mainAxisExtent); final double forwardDirectionRemainingPaintExtent = @@ -256,8 +282,6 @@ class UnboundedRenderViewport extends RenderViewport { final double forwardDirectionRemainingCacheExtent = (fullCacheExtent - centerCacheOffset).clamp(0.0, fullCacheExtent); - final RenderSliver? leadingNegativeChild = childBefore(center!); - if (leadingNegativeChild != null) { // negative scroll offsets final double result = layoutChildSequence(