TabController class

Coordinates tab selection between a TabBar and a TabBarView.

The index property is the index of the selected tab and the animation represents the current scroll positions of the tab bar and the tar bar view. The selected tab's index can be changed with animateTo.

A stateful widget that builds a TabBar or a TabBarView can create a TabController and share it directly.

When the TabBar and TabBarView don't have a convenient stateful ancestor, a TabController can be shared by providing a DefaultTabController inherited widget.

Sample code

This widget introduces a Scaffold with an AppBar and a TabBar.

class MyTabbedPage extends StatefulWidget {
  const MyTabbedPage({ Key key }) : super(key: key);
  _MyTabbedPageState createState() => _MyTabbedPageState();

class _MyTabbedPageState extends State<MyTabbedPage> with SingleTickerProviderStateMixin {
  final List<Tab> myTabs = <Tab>[
    Tab(text: 'LEFT'),
    Tab(text: 'RIGHT'),

  TabController _tabController;

  void initState() {
    _tabController = TabController(vsync: this, length: myTabs.length);

 void dispose() {

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: myTabs,
      body: TabBarView(
        controller: _tabController,
        children: tab) {
          return Center(child: Text(tab.text));


TabController({int initialIndex: 0, @required int length, @required TickerProvider vsync })
Creates an object that manages the state required by TabBar and a TabBarView. [...]


animation Animation<double>
An animation whose value represents the current position of the TabBar's selected tab indicator as well as the scrollOffsets of the TabBar and TabBarView. [...]
index int
The index of the currently selected tab. Changing the index also updates previousIndex, sets the animation's value to index, resets indexIsChanging to false, and notifies listeners. [...]
read / write
indexIsChanging bool
True while we're animating from previousIndex to index.
length int
The total number of tabs. Typically greater than one.
offset double
The difference between the animation's value and index. The offset value must be between -1.0 and 1.0. [...]
read / write
previousIndex int
The index of the previously selected tab. Initially the same as index.
hashCode int
The hash code for this object. [...]
read-only, inherited
hasListeners bool
Whether any listeners are currently registered. [...]
@protected, read-only, inherited
runtimeType Type
A representation of the runtime type of the object.
read-only, inherited


animateTo(int value, { Duration duration: kTabScrollDuration, Curve curve: Curves.ease }) → void
Immediately sets index and previousIndex and then plays the animation from its current value to index. [...]
dispose() → void
Discards any resources used by the object. After this is called, the object is not in a usable state and should be discarded (calls to addListener and removeListener will throw after the object is disposed). [...]
addListener(VoidCallback listener) → void
Register a closure to be called when the object changes. [...]
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. [...]
notifyListeners() → void
Call all the registered listeners. [...]
@protected, inherited
removeListener(VoidCallback listener) → void
Remove a previously registered closure from the list of closures that are notified when the object changes. [...]
toString() String
Returns a string representation of this object.


operator ==(dynamic other) bool
The equality operator. [...]