在 Material Design 设计准则里,Tabs 是一种常用的布局模型。Flutter 自带的 material 库 可以帮助开发者们非常便捷的创建 Tab 布局。

步骤

  • 创建 TabController

  • 创建 tabs

  • 为每个 tab 创建内容

1. 创建 TabController

为了使所选的 tab 与它所对应的内容能够同步变化,需要用 TabController进行控制。

我们既可以手动创建一个 TabController 也能够直接使用 DefaultTabController Widget。最简单的选择是使用 DefaultTabController Widget,因为它能够创建出一个可供所有子 Widgets 使用的 TabController

  1. DefaultTabController(
  2. // The number of tabs / content sections we need to display
  3. length: 3,
  4. child: // See the next step!
  5. );

2. 创建 tabs

现在我们已经成功创建了 TabController,接下来就可以用 TabBar Widget 来创建 tabs 。下面这个示例创建了包含三组 Tab Widget 的 TabBar(一个),并把它放置于 AppBar Widget 中。

  1. DefaultTabController(
  2. length: 3,
  3. child: Scaffold(
  4. appBar: AppBar(
  5. bottom: TabBar(
  6. tabs: [
  7. Tab(icon: Icon(Icons.directions_car)),
  8. Tab(icon: Icon(Icons.directions_transit)),
  9. Tab(icon: Icon(Icons.directions_bike)),
  10. ],
  11. ),
  12. ),
  13. ),
  14. );

TabBar 默认将会在 Widget 树中向上寻找离它最近的一个 DefaultTabController 节点作为自己的 TabController。如果您想手动创建 TabController,那么您必须将它作为参数传给 TabBar

3. 为每个 tab 创建内容

现在我们已经成功创建了一些 tabs ,接下来要实现的是 tab 被选中时显示其对应的内容。为了实现这个效果,我们将使用 TabBarView Widget。

注意: TabBarView 中内容的顺序很重要,它必须与 TabBar 中tab的顺序相对应!

  1. TabBarView(
  2. children: [
  3. Icon(Icons.directions_car),
  4. Icon(Icons.directions_transit),
  5. Icon(Icons.directions_bike),
  6. ],
  7. );

一个完整的例子

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(TabBarDemo());
  4. }
  5. class TabBarDemo extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: DefaultTabController(
  10. length: 3,
  11. child: Scaffold(
  12. appBar: AppBar(
  13. bottom: TabBar(
  14. tabs: [
  15. Tab(icon: Icon(Icons.directions_car)),
  16. Tab(icon: Icon(Icons.directions_transit)),
  17. Tab(icon: Icon(Icons.directions_bike)),
  18. ],
  19. ),
  20. title: Text('Tabs Demo'),
  21. ),
  22. body: TabBarView(
  23. children: [
  24. Icon(Icons.directions_car),
  25. Icon(Icons.directions_transit),
  26. Icon(Icons.directions_bike),
  27. ],
  28. ),
  29. ),
  30. ),
  31. );
  32. }
  33. }

Tabs Demo