TabBar和TabBarView到底是什么关系呢,简而言之,TabBar就是导航栏,TabBarView就是导航栏当前所对应的内容区。

一、TabBar

TabBar 的定义如下:

  1. const TabBar({
  2. Key key,
  3. @required this.tabs, // 子标签
  4. this.controller, // 控制器
  5. this.isScrollable = false, // 能否滑动, false:tab宽度则等比,true:tab宽度则包裹item
  6. this.indicatorColor, // 指示器颜色
  7. this.indicatorWeight = 2.0,
  8. this.indicatorPadding = EdgeInsets.zero,
  9. this.indicator,
  10. this.indicatorSize, // TabBarIndicatorSize.label:indicator与文字同宽,TabBarIndicatorSize.tab:与tab同宽
  11. this.labelColor, // 选中标签颜色
  12. this.labelStyle, // 选中标签样式
  13. this.labelPadding,
  14. this.unselectedLabelColor, // 未选中标签颜色
  15. this.unselectedLabelStyle,
  16. this.dragStartBehavior = DragStartBehavior.down,
  17. this.onTap,//点击事件
  18. })

二、TabBarView

TabBarView 只是一个容器, 其定义如下:

  1. const TabBarView({
  2. Key key,
  3. @required this.children, // 子widget
  4. this.controller, // 控制器
  5. this.physics,
  6. this.dragStartBehavior = DragStartBehavior.down,
  7. })

三、联动使用

系统提供了一个 DefaultTabController,只需要把TabBar和TabBarView包裹起来就能实现联动

  1. const DefaultTabController({
  2. Key key,
  3. @required this.length,
  4. this.initialIndex = 0,
  5. @required this.child,
  6. })

实例:
007.gif

  1. class HomePage extends StatefulWidget {
  2. @override
  3. createState() => new _HomePageState();
  4. }
  5. class _HomePageState extends State<HomePage> {
  6. TabController tabController;
  7. final List<Tab> myTabs = <Tab>[
  8. new Tab(text: '语文'),
  9. new Tab(text: '数学'),
  10. new Tab(text: '英语'),
  11. new Tab(text: '化学'),
  12. new Tab(text: '物理'),
  13. new Tab(text: '政治'),
  14. new Tab(text: '经济'),
  15. new Tab(text: '体育'),
  16. ];
  17. @override
  18. void initState() {
  19. super.initState();
  20. this.tabController = TabController(length: myTabs.length, vsync: this); // 定义一个 TabController
  21. }
  22. @override
  23. Widget build(BuildContext context) {
  24. return DefaultTabController(
  25. length: myTabs.length,
  26. child: new Scaffold(
  27. appBar: new AppBar(
  28. title: Text('首页'),
  29. bottom: new TabBar(
  30. controller: tabController, // 绑定 TabController
  31. tabs: myTabs,
  32. isScrollable: true,
  33. ),
  34. ),
  35. body: new TabBarView(
  36. controller: tabController, // 绑定 TabController
  37. children: myTabs.map((Tab tab) { // 数量应与tabs的数量相同
  38. return new Center(child: new Text(tab.text));
  39. }).toList(),
  40. ),
  41. ),
  42. );
  43. }
  44. }

如果要获取当前tab的index, 可以使用 tabController.index 获取, 下标从 0 开始

监听tab的变化

通过 tabController.addListener 为tab切换添加监听

  1. TabController tabController;
  2. int currentTabIndex = 0;
  3. @override
  4. void initState() {
  5. super.initState();
  6. this.tabController = TabController(length: 2, vsync: this);
  7. tabController.addListener(() => _onTabChanged());
  8. }
  9. _onTabChanged () {
  10. setState(() {
  11. currentTabIndex = tabController.index;
  12. });
  13. }

参考资料