Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Created July 14, 2022 17:35
Show Gist options
  • Save slightfoot/201487d4b0eb2b6b0ee68eeb0e4cac12 to your computer and use it in GitHub Desktop.
Save slightfoot/201487d4b0eb2b6b0ee68eeb0e4cac12 to your computer and use it in GitHub Desktop.

Revisions

  1. slightfoot created this gist Jul 14, 2022.
    69 changes: 69 additions & 0 deletions smooth_scroll.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,69 @@
    // MIT License
    //
    // Copyright (c) 2022 Simon Lightfoot
    //
    // Permission is hereby granted, free of charge, to any person obtaining a copy
    // of this software and associated documentation files (the "Software"), to deal
    // in the Software without restriction, including without limitation the rights
    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    // copies of the Software, and to permit persons to whom the Software is
    // furnished to do so, subject to the following conditions:
    //
    // The above copyright notice and this permission notice shall be included in all
    // copies or substantial portions of the Software.
    //
    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    // SOFTWARE.
    //
    import 'package:flutter/material.dart';

    class SmoothScrollController extends ScrollController {
    SmoothScrollController({
    super.initialScrollOffset,
    super.keepScrollOffset,
    super.debugLabel,
    this.velocityMultiplier = 5,
    });

    final double velocityMultiplier;

    @override
    ScrollPosition createScrollPosition(
    ScrollPhysics physics, ScrollContext context, ScrollPosition? oldPosition) {
    return SmoothScrollPositionWithSingleContext(
    velocityMultiplier: velocityMultiplier,
    physics: physics,
    context: context,
    initialPixels: initialScrollOffset,
    keepScrollOffset: keepScrollOffset,
    oldPosition: oldPosition,
    debugLabel: debugLabel,
    );
    }
    }

    class SmoothScrollPositionWithSingleContext extends ScrollPositionWithSingleContext {
    SmoothScrollPositionWithSingleContext({
    required this.velocityMultiplier,
    required super.physics,
    required super.context,
    super.initialPixels,
    super.keepScrollOffset,
    super.oldPosition,
    super.debugLabel,
    });

    final double velocityMultiplier;

    @override
    void pointerScroll(double delta) {
    double velocity = ((activity?.velocity ?? 0.0) + (delta * velocityMultiplier))
    .clamp(-physics.maxFlingVelocity, physics.maxFlingVelocity);
    goBallistic(velocity);
    }
    }