anchor.diff:  }
   
   class _TabBarState<T> extends ScrollableState<TabBar<T>> implements TabBarSelectionAnimationListener {
  -
     TabBarSelectionState<T> _selection;
     bool _valueIsChanging = false;
  +  int _lastSelectedIndex = -1;
   
     void _initSelection(TabBarSelectionState<T> selection) {
       _selection?.unregisterAnimationListener(this);
  
positive.code:     if (config.labels.length == 0 || _selection == null)
        return;
  
      if (!_valueIsChanging && _selection.valueIsChanging) {
        if (config.isScrollable)
          scrollTo(_centeredTabScrollOffset(_selection.index), duration: _kTabBarScroll);
        _indicatorTween
          ..begin = _indicatorRect ?? _tabIndicatorRect(_selection.previousIndex)
          ..end = _tabIndicatorRect(_selection.index);
        _valueIsChanging = true;
      }
      Rect oldRect = _indicatorRect;
      double t = _selection.animation.value;
  
negative.code:       // want to curve the animation. When _valueIsChanging is false, we're
        // animating based on a pointer event and want linear feedback. It's
        // possible we should move this curve into the selection animation.
        // We animate the leading and trailing edges of the rect differently.
        // The easiest way to do this is to lerp 2 rects, and piece them together
        // into 1.
        Rect leftRect, rightRect;
        if (_selection.index > _selection.previousIndex) {
          // Moving to the right - right edge is leading.
          rightRect = _indicatorTween.lerp(_kTabIndicatorLeadingCurve.transform(t));
          leftRect = _indicatorTween.lerp(_kTabIndicatorTrailingCurve.transform(t));
        } else {
          // Moving to the left - left edge is leading.
          leftRect = _indicatorTween.lerp(_kTabIndicatorLeadingCurve.transform(t));
          rightRect = _indicatorTween.lerp(_kTabIndicatorTrailingCurve.transform(t));
        }
        _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. */ });
    }
  
    Size _viewportSize = Size.zero;
  