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;
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; } }); }