anchor.diff:  
       if (_valueIsChanging && status == AnimationStatus.completed) {
         _valueIsChanging = false;
  -      _indicatorTween
  -        ..begin = _tabIndicatorRect(math.max(0, _selection.index - 1))
  -        ..end = _tabIndicatorRect(math.min(config.labels.length - 1, _selection.index + 1));
         setState(() {
  +        _initIndicatorTweenForDrag();
           _indicatorRect = _tabIndicatorRect(_selection.index);
         });
       }
  
positive.code:   Size _tabBarSize;
    List<double> _tabWidths;
    Rect _indicatorRect;
    RectTween _indicatorTween = new RectTween();
  
    Rect _tabRect(int tabIndex) {
      assert(_tabBarSize != null);
  
negative.code:       return;
  
      if (_lastSelectedIndex != _selection.index) {
        _valueIsChanging = true;
        if (config.isScrollable)
          scrollTo(_centeredTabScrollOffset(_selection.index), duration: _kTabBarScroll);
        _initIndicatorTweenForAnimation();
        _lastSelectedIndex = _selection.index;
      } else if (_indicatorTween == null) {
        _initIndicatorTweenForDrag();
      }
  
      Rect oldRect = _indicatorRect;
      double t = _selection.animation.value;
  
      // When _valueIsChanging is false, we're animating based on drag gesture and
      // want linear selected tab indicator motion. When _valueIsChanging is true,
      // a ticker is driving the selection change and we want to curve the animation.
      // In this case the leading and trailing edges of the move at different rates.
      // The easiest way to do this is to lerp 2 rects, and piece them together into 1.
      if (!_valueIsChanging) {
        _indicatorRect = _indicatorTween.lerp(t);
      } else {
        Rect leftRect, rightRect;
        if (_selection.index > _selection.previousIndex) {
          // Moving to the right - right edge is leading.
  