tabAppbar_full.png
    入口文件 main.dart 如下

    1. import 'package:flutter/material.dart';
    2. void main() {
    3. runApp(new MyApp());
    4. }
    5. class MyApp extends StatelessWidget {
    6. @override
    7. Widget build(BuildContext context) {
    8. return Material(
    9. tilte: 'Flutter Demo',
    10. theme: new ThemeData(),
    11. home: Text('这里是demo'),
    12. debugShowCheckedModeBanner: false,
    13. );
    14. }
    15. }

    lib 文件夹下新建 appbar.dart 文件

    按照惯例 引入 material

    1. import 'package:flutter/material.dart';
    2. class AppBarTabHome extends StatelessWidget {
    3. @override
    4. Widget build(BuildContext context) {
    5. return Text('这里是 AppBarTab页');
    6. }
    7. }

    当基础文件写好后,我们首先先通过UI图查看数据结构,拥有一个 tilteicon
    所以我们定义 tab 的选项 Choice

    1. //...
    2. class Choice {
    3. final String title;
    4. final IconData icon;
    5. const Choice({ this.title, this.icon });
    6. }
    7. const List<Choice> choices = [
    8. Choice(title: 'Car', icon: Icons.directions_car),
    9. Choice(title: 'Bick', icon: Icons.directions_bike),
    10. Choice(title: 'Boat', icon: Icons.directions_boat),
    11. Choice(title: 'Bus', icon: Icons.directions_bus),
    12. Choice(title: 'Train', icon: Icons.directions_train),
    13. Choice(title: 'Walk', icon: Icons.directions_walk),
    14. Choice(title: 'Ferry', icon: Icons.directions_ferry),
    15. Choice(title: 'Railway', icon: Icons.directions_railway),
    16. Choice(title: 'Subway', icon: Icons.directions_subway),
    17. ];

    接下来我们要构造 Tab 控制的页面了,用到 Material 中的 DefaultTabController
    修改 我们的 AppBarTabHome 类,实现基本结构

    1. import 'package:flutter/material.dart';
    2. class AppBarTabHome extends StatelessWidget {
    3. @override
    4. Widget build(BuildContext context) {
    5. return DefaultTabController(
    6. length: choices.length,
    7. child: Scaffold(
    8. appBar: AppBar(
    9. title: Text('Tab AppBar'),
    10. bottom: TabBar(
    11. tabs: []
    12. ),
    13. ),
    14. body: TabBarView(
    15. children: [],
    16. ),
    17. ),
    18. );
    19. }
    20. }

    我们根据 choices 生成我们需要的 ChoiceCard 组件和 Tab 组件

    1. class ChoiceCard extends StatelessWidget {
    2. final Choice choice;
    3. const ChoiceCard({ Key key, this.choice }):super(key: key);
    4. @override
    5. Widget build(BuildContext context) {
    6. final TextStyle textStyle = Theme.of(context).textTheme.display1;
    7. return Card(
    8. child: Center(
    9. child: Column(
    10. mainAxisAligment: MainAxisAligment.center,
    11. crossAxisAligment: CrossAxisAligment.center,
    12. mainAxisSize: MainAxisSize.min,
    13. children: <Widget>[
    14. Icon(choice.icon, size: 128.0, color: textStyle.color),
    15. Text(choice.title, style: textStyle),
    16. ],
    17. ),
    18. ),
    19. );
    20. }
    21. }
    22. //...
    23. tabs: choices.map((Choice choice) {
    24. return Tab(text: choice.title, icon: Icon(choice.icon));
    25. }).toList(),
    26. //...
    27. body: TabBarView(
    28. children: choices.map((Choice choice) {
    29. return ChoiceCard(choice)
    30. }).toList(),
    31. ),

    保存后一看, 诶?这个 tabbar 怎么都挤成一团了?
    tabAppbar_tab.png
    原来的是可以滑动的,那么我们直接查看 Tabbar 类,可以看到有一个 isScrollable 属性,默认为 false ,我们将其设置为 true 即可。