Working with Tabs
Working with tabs is a common pattern in apps following the Material Design guidelines. Flutter includes a convenient way to create tab layouts as part of the material library.
Directions
- Create a
TabController
- Create the tabs
- Create content for each tab
1. Create a TabController
In order for tabs to work, we’ll need to keep the selected tab and content
sections in sync. This is the job of the TabController
.
We can either manually create a TabController
or use the
DefaultTabController
Widget. Using the DefaultTabController
is the simplest option, since it will
create a TabController
for us and make it available to all descendant Widgets.
new DefaultTabController(
// The number of tabs / content sections we need to display
length: 3,
child: // See the next step!
);
2. Create the tabs
Now that we have a TabController
to work with, we can create our tabs using
the TabBar
Widget. In this example, we’ll create a TabBar
with 3 Tab
Widgets and place it within an AppBar
.
new DefaultTabController(
length: 3,
child: new Scaffold(
appBar: new AppBar(
bottom: new TabBar(
tabs: [
new Tab(icon: new Icon(Icons.directions_car)),
new Tab(icon: new Icon(Icons.directions_transit)),
new Tab(icon: new Icon(Icons.directions_bike)),
],
),
),
),
);
By default, the TabBar
looks up the Widget tree for the nearest
DefaultTabController
. If you’re manually creating a TabController
, you’ll
need to pass it to the TabBar
.
3. Create content for each tab
Now that we have tabs, we’ll want to display content when a tab is selected.
For this purpose, we’ll employ the TabBarView
Widget.
Note: Order is important and must correspond to the order of the tabs in the
TabBar
!
new TabBarView(
children: [
new Icon(Icons.directions_car),
new Icon(Icons.directions_transit),
new Icon(Icons.directions_bike),
],
);
Complete Example
import 'package:flutter/material.dart';
void main() {
runApp(new TabBarDemo());
}
class TabBarDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new DefaultTabController(
length: 3,
child: new Scaffold(
appBar: new AppBar(
bottom: new TabBar(
tabs: [
new Tab(icon: new Icon(Icons.directions_car)),
new Tab(icon: new Icon(Icons.directions_transit)),
new Tab(icon: new Icon(Icons.directions_bike)),
],
),
title: new Text('Tabs Demo'),
),
body: new TabBarView(
children: [
new Icon(Icons.directions_car),
new Icon(Icons.directions_transit),
new Icon(Icons.directions_bike),
],
),
),
),
);
}
}