T value

The currently selected value.

Writing to this field will cause the tab selection to animate from the previous value to the new value.

Source

T get value => _value;
void value=(T newValue)

Source

set value(T newValue) {
  if (newValue == _value)
    return;
  _previousValue = _value;
  _value = newValue;
  _writeValue();
  _valueIsChanging = true;

  // If the selected value change was triggered by a drag gesture, the current
  // value of _controller.value will reflect where the gesture ended. While
  // the drag was underway the controller's value indicates where the indicator
  // and TabBarView scrollPositions are vis the indices of the two tabs adjacent
  // to the selected one. So 0.5 means the drag didn't move at all, 0.0 means the
  // drag extended to the beginning of the tab on the left and 1.0 likewise for
  // the tab on the right. That is unless the index of the selected value was 0
  // or values.length - 1. In those cases the controller's value just moves between
  // the selected tab and the adjacent one. So: convert the controller's value
  // here to reflect the fact that we're now moving between (just) the previous
  // and current selection index.

  double value;
  if (_controller.status == AnimationStatus.completed)
    value = 0.0;
  else if (_previousValue == values.first)
    value = _controller.value;
  else if (_previousValue == values.last)
    value = 1.0 - _controller.value;
  else if (previousIndex < index)
    value = (_controller.value - 0.5) * 2.0;
  else
    value = 1.0 - _controller.value * 2.0;

  _controller
    ..value = value
    ..forward().then((_) {
      // TODO(abarth): Consider using a status listener and checking for
      // AnimationStatus.completed.
      if (_controller.value == 1.0) {
        if (config.onChanged != null)
          config.onChanged(_value);
        _valueIsChanging = false;
      }
    });
}