@@ -1676,29 +1676,41 @@ class RawScrollbarState<T extends RawScrollbar> extends State<T> with TickerProv
16761676 void _updateScrollPosition (Offset updatedOffset) {
16771677 assert (_cachedController != null );
16781678 assert (_startDragScrollbarAxisOffset != null );
1679+ assert (_lastDragUpdateOffset != null );
16791680 assert (_startDragThumbOffset != null );
16801681
16811682 final ScrollPosition position = _cachedController! .position;
1682- late double primaryDelta;
1683+ late double primaryDeltaFromDragStart;
1684+ late double primaryDeltaFromLastDragUpdate;
16831685 switch (position.axisDirection) {
16841686 case AxisDirection .up:
1685- primaryDelta = _startDragScrollbarAxisOffset! .dy - updatedOffset.dy;
1687+ primaryDeltaFromDragStart = _startDragScrollbarAxisOffset! .dy - updatedOffset.dy;
1688+ primaryDeltaFromLastDragUpdate = _lastDragUpdateOffset! .dy - updatedOffset.dy;
16861689 break ;
16871690 case AxisDirection .right:
1688- primaryDelta = updatedOffset.dx - _startDragScrollbarAxisOffset! .dx;
1691+ primaryDeltaFromDragStart = updatedOffset.dx - _startDragScrollbarAxisOffset! .dx;
1692+ primaryDeltaFromLastDragUpdate = updatedOffset.dx - _lastDragUpdateOffset! .dx;
16891693 break ;
16901694 case AxisDirection .down:
1691- primaryDelta = updatedOffset.dy - _startDragScrollbarAxisOffset! .dy;
1695+ primaryDeltaFromDragStart = updatedOffset.dy - _startDragScrollbarAxisOffset! .dy;
1696+ primaryDeltaFromLastDragUpdate = updatedOffset.dy - _lastDragUpdateOffset! .dy;
16921697 break ;
16931698 case AxisDirection .left:
1694- primaryDelta = _startDragScrollbarAxisOffset! .dx - updatedOffset.dx;
1699+ primaryDeltaFromDragStart = _startDragScrollbarAxisOffset! .dx - updatedOffset.dx;
1700+ primaryDeltaFromLastDragUpdate = _lastDragUpdateOffset! .dx - updatedOffset.dx;
16951701 break ;
16961702 }
16971703
16981704 // Convert primaryDelta, the amount that the scrollbar moved since the last
1699- // time when drag started, into the coordinate space of the scroll
1705+ // time when drag started or last updated , into the coordinate space of the scroll
17001706 // position, and jump to that position.
1701- final double scrollOffsetGlobal = scrollbarPainter.getTrackToScroll (primaryDelta + _startDragThumbOffset! );
1707+ double scrollOffsetGlobal = scrollbarPainter.getTrackToScroll (primaryDeltaFromDragStart + _startDragThumbOffset! );
1708+ if (primaryDeltaFromDragStart > 0 && scrollOffsetGlobal < position.pixels
1709+ || primaryDeltaFromDragStart < 0 && scrollOffsetGlobal > position.pixels) {
1710+ // Adjust the position value if the scrolling direction conflicts with
1711+ // the dragging direction due to scroll metrics shrink.
1712+ scrollOffsetGlobal = position.pixels + scrollbarPainter.getTrackToScroll (primaryDeltaFromLastDragUpdate);
1713+ }
17021714 if (scrollOffsetGlobal != position.pixels) {
17031715 // Ensure we don't drag into overscroll if the physics do not allow it.
17041716 final double physicsAdjustment = position.physics.applyBoundaryConditions (position, scrollOffsetGlobal);
@@ -1772,6 +1784,7 @@ class RawScrollbarState<T extends RawScrollbar> extends State<T> with TickerProv
17721784 _fadeoutTimer? .cancel ();
17731785 _fadeoutAnimationController.forward ();
17741786 _startDragScrollbarAxisOffset = localPosition;
1787+ _lastDragUpdateOffset = localPosition;
17751788 _startDragThumbOffset = scrollbarPainter.getThumbScrollOffset ();
17761789 _thumbDragging = true ;
17771790 }
@@ -1786,7 +1799,6 @@ class RawScrollbarState<T extends RawScrollbar> extends State<T> with TickerProv
17861799 if (_lastDragUpdateOffset == localPosition) {
17871800 return ;
17881801 }
1789- _lastDragUpdateOffset = localPosition;
17901802 final ScrollPosition position = _cachedController! .position;
17911803 if (! position.physics.shouldAcceptUserOffset (position)) {
17921804 return ;
@@ -1796,6 +1808,7 @@ class RawScrollbarState<T extends RawScrollbar> extends State<T> with TickerProv
17961808 return ;
17971809 }
17981810 _updateScrollPosition (localPosition);
1811+ _lastDragUpdateOffset = localPosition;
17991812 }
18001813
18011814 /// Handler called when a long press has ended.
0 commit comments