anchor.diff:      return scrollTo(newScrollOffset, duration: duration, curve: curve);
     }
   
  +  void fling(Offset velocity) {
  +    if (velocity != Offset.zero) {
  +      _startToEndAnimation(velocity: _scrollVelocity(velocity));
  +    } else if (!_toEndAnimation.isAnimating && (_toOffsetAnimation == null || !_toOffsetAnimation.isAnimating)) {
  +      settleScrollOffset();
  +    }
  +  }
  +
     void settleScrollOffset() {
       _startToEndAnimation();
     }
  
positive.code:       .clamp(scrollBehavior.minScrollOffset, scrollBehavior.maxScrollOffset);
    }
  
    void _handleDragEnd(sky.Offset velocity) {
      double scrollVelocity = _scrollVelocity(velocity);
      double newScrollOffset = _snapScrollOffset(scrollOffset + scrollVelocity.sign * itemExtent)
        .clamp(_snapScrollOffset(scrollOffset - itemExtent / 2.0),
  
negative.code:   }
  
    void _handleDragEnd(Offset velocity) {
      fling(velocity);
    }
  
    final List<ScrollListener> _listeners = new List<ScrollListener>();
  