applyPhysicsToUserOffset method

  1. @override
double applyPhysicsToUserOffset(
  1. ScrollMetrics position,
  2. double offset

Used by DragScrollActivity and other user-driven activities to convert an offset in logical pixels as provided by the DragUpdateDetails into a delta to apply (subtract from the current position) using ScrollActivityDelegate.setPixels.

This is used by some ScrollPosition subclasses to apply friction during overscroll situations.

This method must not adjust parts of the offset that are entirely within the bounds described by the given position.

The given position is only valid during this method call. Do not keep a reference to it to use later, as the values may update, may not update, or may update to reflect an entirely unrelated scrollable.


double applyPhysicsToUserOffset(ScrollMetrics position, double offset) {
  assert(offset != 0.0);
  assert(position.minScrollExtent <= position.maxScrollExtent);

  if (!position.outOfRange) {
    return offset;

  final double overscrollPastStart = math.max(position.minScrollExtent - position.pixels, 0.0);
  final double overscrollPastEnd = math.max(position.pixels - position.maxScrollExtent, 0.0);
  final double overscrollPast = math.max(overscrollPastStart, overscrollPastEnd);
  final bool easing = (overscrollPastStart > 0.0 && offset < 0.0)
      || (overscrollPastEnd > 0.0 && offset > 0.0);

  final double friction = easing
      // Apply less resistance when easing the overscroll vs tensioning.
      ? frictionFactor((overscrollPast - offset.abs()) / position.viewportDimension)
      : frictionFactor(overscrollPast / position.viewportDimension);
  final double direction = offset.sign;

  if (easing && decelerationRate == {
    return direction * offset.abs();
  return direction * _applyFriction(overscrollPast, offset.abs(), friction);