anchor.diff:  
     void _onScrollUpdated(ScrollableState scrollable) {
       final double value = scrollable.scrollOffset;
  -    if ((value < _minScrollOffset || value > _maxScrollOffset) &&
  -        ((value - _scrollOffset).abs() > kPixelScrollTolerance.distance)) {
  -      _hideTimer?.cancel();
  -      _hideTimer = new Timer(_kIndicatorTimeoutDuration, _hide);
  -      // Changing the animation's value causes an implicit setState().
  -      _extentAnimation.value = value < _minScrollOffset ? _minScrollOffset - value : value - _maxScrollOffset;
  +    if (_isOverscroll(value)) {
  +      _refreshHideTimer();
  +      // Hide the indicator as soon as user starts scrolling in the reverse direction of overscroll.
  +      if (_isReverseScroll(value)) {
  +        _hide();
  +      } else {
  +        // Changing the animation's value causes an implicit setState().
  +        _extentAnimation.value = value < _minScrollOffset ? _minScrollOffset - value : value - _maxScrollOffset;
  +      }
       }
       _updateState(scrollable);
     }
  
positive.code: const double _kMinIndicatorOpacity = 0.0;
  const double _kMaxIndicatorOpacity = 0.25;
  const Duration _kIndicatorHideDuration = const Duration(milliseconds: 200);
  const Duration _kIndicatorTimeoutDuration = const Duration(seconds: 1);
  final Tween<double> _kIndicatorOpacity = new Tween<double>(begin: 0.0, end: 0.3);
  
  class _Painter extends CustomPainter {
  
negative.code:   void _hide() {
      _hideTimer?.cancel();
      _hideTimer = null;
      // Gaurding _hide() being called while indicator is already animating.
      if (!_extentAnimation.isAnimating) {
        _extentAnimation.reverse();
      }
    }
  
    void _updateState(ScrollableState scrollable) {
  