silky_scroll 2.1.0
silky_scroll: ^2.1.0 copied to clipboard
Silky Scroll is a package developed in Flutter to provide a smooth scrolling experience.
Changelog #
All notable changes to this project will be documented in this file.
2.1.0 #
Breaking #
- Builder signature changed:
SilkyScrollWidgetBuildernow receives a 4th parameterPointerDeviceKind? pointerDeviceKind, allowing widgets to adapt their behavior based on the detected input device. - Removed bubbling option: Scroll bubbling to parent views is now seamlessly integrated into the default edge-locking logic, providing a much more natural nested-scroll experience without any configuration.
Added #
decayLogFactorparameter — controls the exponential-decay log factor for smooth-scroll convergence speed (default:12).recoilDurationSecparameter — controls the duration of the bounce-back (recoil) animation in seconds (default:0.2).setManualPointerDeviceKindcallback — allows manually overriding the detected pointer device kind for custom input handling.- Exported
kDefaultDecayLogFactorandkDefaultRecoilDurationSecconstants from barrel file.
Changed #
- Scroll bubbling is now handled automatically within the core edge-locking state machine, eliminating the need for a separate configuration option and delivering smoother transitions in nested scroll views.
- Recoil (bounce-back) animation and overshoot clamping now only activate when the widget's scroll physics is
BouncingScrollPhysics. Non-bouncing physics (e.g.ClampingScrollPhysics) no longer overshoot scroll extents or trigger recoil.
2.0.3 #
Fixed #
- Fixed
include_file_not_foundwarning in exampleanalysis_options.yamlby replacing deprecatedflutter_lintswithlints. - Removed unnecessary
package:flutter/scheduler.dartimport inSilkyScrollState(already provided bymaterial.dart). - Removed unused
package:flutter/foundation.dartimport in input handler tests. - Replaced unnecessary lambdas with tear-offs in state tests.
2.0.2 #
Changed #
- Ticker-based animation engine: Replaced per-event
controller.animateTo()with a singleTicker+jumpTo()loop using frame-rate-independent exponential smoothing. Eliminates the stutter caused by repeatedly cancelling and restarting easing curves on rapid mouse-wheel input. - Targeted rebuild: Replaced
ListenableBuilder(which rebuilt the entire widget subtree on everynotifyListeners()) with a dedicated_onPhysicsChangedlistener that callssetStateonly when theScrollPhysicsreference actually changes. - Recoil animation: Bounce-back (recoil) to edge now runs inside the same Ticker using
Curves.easeInOutSineinterpolation, avoiding a separateanimateTo()call that could conflict with ongoing scroll animations.
Fixed #
- Overscroll bounce-back stutter: Added
silkyTickerActiveflag toSilkyScrollPositionthat suppressesgoBallistic()while the Ticker is running. Previously, eachjumpTo()during overscroll triggered Flutter'sBouncingScrollPhysicsspring simulation, which fought with the Ticker every frame — causing visible jitter at both top and bottom edges.
2.0.1 #
Fixed #
onScrollandonEdgeOverScrollcallbacks were not passed fromSilkyScrollwidget toSilkyScrollState, causing them to always benull.onEdgeOverScrollwas never invoked; it is now called when mouse-wheel or touch/trackpad scroll reaches an edge.
2.0.0 #
Breaking #
- Removed
providerdependency; replaced withInheritedWidget+ListenableBuilder. - Applied Dart 3
final class/abstract interface classmodifiers to all public classes. Externalextends/implementsis no longer permitted for concrete types. - Exported
ScrollPhysicsPhaseenum from barrel file.
Added #
SilkyScrollConfig.copyWith,==,hashCode, andtoString.SilkyScrollMousePointerManager.resetForTesting(@visibleForTesting).SilkyScrollWebManagerInterface.isWebPlatformfor conditional-import–based platform detection.SilkyEdgeDetector: sub-pixel edge detection using threshold instead oftoInt().- State machine
_transitionTonow guards against Timer creation after dispose. SilkyScrollController.attach/detachguard against duplicate position registration.- Test infrastructure:
test/helpers/test_helpers.dartshared utilities. - New tests for
SilkyScrollAnimator,SilkyInputHandler,SilkyScrollConfig, and integration tests (67 total, up from 24).
Changed #
kIsWebruntime branching inSilkyInputHandlerreplaced with conditional-import pattern viaisWebPlatform.ListenableBuilderrebuild scope reduced:onAnimationStateChangedno longer triggers unnecessary widget rebuilds for recoil state.- Dispose order in
SilkyScrollStatemade deterministic and safe. - Edge-detection refactored to switch expression / pattern matching (Dart 3).
SilkyScrollAnimator._handleRecoilrefactored to switch expression.- Web helper magic number
Duration(milliseconds: 700)extracted to_kOverscrollBehaviorXResetDelayconstant. - Lint configuration upgraded from
flutter_lintstopackage:lints/recommended.yamlwith custom rules. - Example restructured to
example/lib/main.dart+example/pubspec.yaml(pub.dev guideline). - README image paths updated from
Bluebar1/dyn_mouse_scrolltoDynaruid/silky_scroll.
Removed #
- Legacy duplicate source files under
lib/root (moved tolib/src/in Phase 1).
Fixed #
_unlockScrollnow correctly transitions_physicsPhaseback toScrollPhysicsPhase.normal._transitionTochecks_disposedbefore creating a new Timer.
1.0.14 #
Fixed #
- Removed usage of
Platformfromdart:iodue to compatibility issues causing errors on Safari in iOS 18.2.
1.0.12 #
Added #
- Added an option to configure whether scroll bubbling is propagated when an inner scroll view reaches its edge within nested scroll views.
1.0.6 #
Changed #
- The duration of scroll momentum transferred to the parent widget has been adjusted to behave more naturally.