From 3928f5afe7db93b3e7b513b71ccc7bd14a071590 Mon Sep 17 00:00:00 2001 From: nyne Date: Sun, 3 Aug 2025 17:05:31 +0800 Subject: [PATCH] Improve smooth scroll. Close #462 --- lib/components/scroll.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/components/scroll.dart b/lib/components/scroll.dart index 741de7d..7510c96 100644 --- a/lib/components/scroll.dart +++ b/lib/components/scroll.dart @@ -117,16 +117,25 @@ class _SmoothScrollProviderState extends State { _futurePosition ??= currentLocation; double k = (_futurePosition! - currentLocation).abs() / 1600 + 1; _futurePosition = _futurePosition! + pointerSignal.scrollDelta.dy * k; + var beforeOffset = (_futurePosition! - currentLocation).abs(); _futurePosition = _futurePosition!.clamp( _controller.position.minScrollExtent, _controller.position.maxScrollExtent, ); + var afterOffset = (_futurePosition! - currentLocation).abs(); if (_futurePosition == old) return; var target = _futurePosition!; + var duration = _fastAnimationDuration; + if (afterOffset < beforeOffset) { + duration = duration * (afterOffset / beforeOffset); + if (duration < Duration(milliseconds: 10)) { + duration = Duration(milliseconds: 10); + } + } _controller .animateTo( _futurePosition!, - duration: _fastAnimationDuration, + duration: duration, curve: Curves.linear, ) .then((_) {