Work with tabs
Working with tabs is a common pattern in apps that follow the Material Design guidelines. Flutter includes a convenient way to create tab layouts as part of the material library.
This recipe creates a tabbed example using the following steps;
- Create a
TabController. - Create the tabs.
- Create content for each tab.
1. Create a TabController
#
For tabs to work, you need to keep the selected tab and content
sections in sync.
This is the job of the TabController.
Either create a TabController manually,
or automatically by using a DefaultTabController
widget.
Using DefaultTabController is the simplest option, since it
creates a TabController and makes it available to all descendant widgets.
return MaterialApp(
home: DefaultTabController(length: 3, child: Scaffold()),
);
2. Create the tabs
#
When a tab is selected, it needs to display content.
You can create tabs using the TabBar
widget.
In this example, create a TabBar with three
Tab
widgets and place it within an AppBar.
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
bottom: const TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
),
),
),
);
By default, the TabBar looks up the widget tree for the nearest
DefaultTabController. If you're manually creating a TabController,
pass it to the TabBar.
3. Create content for each tab
#
Now that you have tabs, display content when a tab is selected.
For this purpose, use the TabBarView
widget.
body: const TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
Interactive example
#import 'package:flutter/material.dart';
void main() {
runApp(const TabBarDemo());
}
class TabBarDemo extends StatelessWidget {
const TabBarDemo({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
bottom: const TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
title: const Text('Tabs Demo'),
),
body: const TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
),
);
}
}
Unless stated otherwise, the documentation on this site reflects Flutter 3.35.5. Page last updated on 2025-10-28. View source or report an issue.