anchor.diff:      _selection = null;
     }
   
  +  // Initialize _indicatorTween for interactive dragging between the tab on the left
  +  // and the tab on the right. In this case _selection.animation.value is 0.5 when
  +  // the indicator is below the selected tab, 0.0 when it's under the left tab, and 1.0
  +  // when it's under the tab on the right.
  +  void _initIndicatorTweenForDrag() {
  +    assert(!_valueIsChanging);
  +    _indicatorTween = new RectTween(
  +      begin: _tabIndicatorRect(math.max(0, _selection.index - 1)),
  +      end: _tabIndicatorRect(math.min(config.labels.length - 1, _selection.index + 1))
  +    );
  +  }
  +
  +  // Initialize _indicatorTween for animating the selected tab indicator from the
  +  // previously selected tab to the newly selected one. In this case
  +  // _selection.animation.value is 0.0 when the indicator is below the previously
  +  // selected tab, and 1.0 when it's under the newly selected one.
  +  void _initIndicatorTweenForAnimation() {
  +    assert(_valueIsChanging);
  +    _indicatorTween = new RectTween(
  +      begin: _indicatorRect ?? _tabIndicatorRect(_selection.previousIndex),
  +      end: _tabIndicatorRect(_selection.index)
  +    );
  +  }
  +
     @override
     void handleStatusChange(AnimationStatus status) {
       if (config.labels.length == 0)
  
positive.code:       _indicatorRect = new Rect.fromLTRB(
          leftRect.left, leftRect.top, rightRect.right, rightRect.bottom
        );
      } else {
        // TODO(abarth): If we've never gone through handleStatusChange before, we
        // might not have set up our _indicatorTween yet.
        _indicatorRect = _indicatorTween.lerp(t);
      }
      if (oldRect != _indicatorRect)
        setState(() { /* The indicator rect has changed. */ });
  
negative.code:     super.initState();
      scrollBehavior.isScrollable = config.isScrollable;
      _initSelection(TabBarSelection.of(context));
      _lastSelectedIndex = _selection.index;
    }
  
    @override
  