飞道的博客

Flutter组件--TabBar使用详情(分段控制器)

375人阅读  评论(0)

TabBar介绍

一个显示水平行选项卡的Widget。 通常创建为 AppBar 的 AppBar.bottom 部分并与 TabBarView 结合使用

在什么情况下使用TabBar

当你的app内容类别比较多的时候,我们常常会用到TabBar,例如网易新闻、京东、B站等,所以TabBar是一个使用非常频繁的组件。

如何创建

步骤一:创建TabController

为了使所选的 tab 与它所对应的内容能够同步变化,需要用 TabController 进行控制。我们既可以手动创建一个 TabController ,也能够直接使用 DefaultTabController widget。最简单的选择是使用 DefaultTabController widget,因为它能够创建出一个可供所有子 widgets 使用的 TabController


  
  1. DefaultTabController(
  2. // 选项卡的数量
  3. length: 3,
  4. child: // 在下一步完成此代码
  5. );

步骤二:创建tabs

当我们创建DefaultTabController, 接下来就可以用 TabBar widget 来创建 tabs。下面这个创建了包含三组 Tab widget 的 TabBar(一个),并把它放置于 AppBar widget 中。


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

步骤三:为每个Tab创建内容

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


  
  1. import 'package:flutter/material.dart';
  2. class TabBarExample extends StatefulWidget {
  3. @override
  4. _TabBarExampleState createState() => _TabBarExampleState();
  5. }
  6. class _TabBarExampleState extends State<TabBarExample> {
  7. @override
  8. Widget build(BuildContext context) {
  9. return DefaultTabController(
  10. length: 3,
  11. child: Scaffold(
  12. appBar: AppBar(
  13. title: Text( "TabBar"),
  14. bottom: TabBar(
  15. tabs: [
  16. Tab(icon: Icon(Icons.directions_bike),),
  17. Tab(icon: Icon(Icons.directions_boat),),
  18. Tab(icon: Icon(Icons.directions_car),),
  19. ],
  20. ),
  21. ),
  22. body: TabBarView(
  23. children: [
  24. Icon(Icons.directions_bike),
  25. Icon(Icons.directions_boat),
  26. Icon(Icons.directions_car),
  27. ],
  28. ),
  29. ),
  30. );
  31. }
  32. }

TabBar效果图


​​​​​​​

 

TabBar属性和说明

序列号 字段 属性 描述
1 tabs List 两个多个的Tab列表
2 controller TabController 控制tab的控制器
3 isScrollable bool 标签栏是否可以水平滚动
4 indicatorColor Color 设置选中Tab指示器的颜色
5 automaticIndicatorColorAdjustment bool 是否自动调整indicatorColor
6 indicatorWeight double 设置选中Tab指示器线条的粗细
7 indicatorPadding EdgeInsetsGeometry 设置选中Tab指示器间距,默认值为 EdgeInsets.zero
8 indicator Decoration 设置选中Tab指示器的外观
9 indicatorSize TabBarIndicatorSize 设置选中Tab指示器的大小
10 labelColor Color 设置选中Tab文字的颜色
11 labelStyle TextStyle 设置选中Tab文字的样式
12 labelPadding EdgeInsetsGeometry 设置选中Tab文字的间距
13 unselectedLabelColor Color 设置未选中Tab文字的颜色
14 unselectedLabelStyle TextStyle 设置未选中Tab文字的样式
15 dragStartBehavior DragStartBehavior 处理拖动开始行为的方式
16 overlayColor MaterialStateProperty 定义响应焦点、悬停和飞溅颜色
17 mouseCursor MouseCursor 鼠标指针进入或悬停在鼠标指针上时的光标
18 enableFeedback bool 检测到的手势是否应提供声音和/或触觉反馈
19 onTap ValueChanged 单击Tab时的回调
20 physics ScrollPhysics TabBar的滚动视图如何响应用户输入

TabBar属性详细使用

1.tabs

由两个多个组成的Tab列表


  
  1. TabBar(
  2. tabs: [
  3. Tab(icon: Icon(Icons.directions_bike),),
  4. Tab(icon: Icon(Icons.directions_boat),),
  5. Tab(icon: Icon(Icons.directions_car),),
  6. ],
  7. )

2.controller

可以控制tab的控制器


  
  1. TabController _tabController;
  2. @override
  3. void initState() {
  4. // TODO: implement initState
  5. super.initState();
  6. _tabController = TabController(length: 3, vsync: this);
  7. }
  8. TabBar(
  9. controller: _tabController,
  10. tabs: [
  11. Tab(icon: Icon(Icons.directions_bike),),
  12. Tab(icon: Icon(Icons.directions_boat),),
  13. Tab(icon: Icon(Icons.directions_car),),
  14. ],
  15. )

3.isScrollable

标签栏是否可以水平滚动


  
  1. TabBar(
  2. isScrollable: false,
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike),),
  5. Tab(icon: Icon(Icons.directions_boat),),
  6. Tab(icon: Icon(Icons.directions_car),),
  7. ],
  8. )

4.indicatorColor

设置选中Tab指示器的颜色


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike),),
  5. Tab(icon: Icon(Icons.directions_boat),),
  6. Tab(icon: Icon(Icons.directions_car),),
  7. ],
  8. )

5.automaticIndicatorColorAdjustment

是否自动调整 indicatorColor,如果 automaticIndicatorColorAdjustment 为 true 时,那么indicatorColor 会自动调整成 Colors.white


  
  1. TabBar(
  2. automaticIndicatorColorAdjustment: false,
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike),),
  5. Tab(icon: Icon(Icons.directions_boat),),
  6. Tab(icon: Icon(Icons.directions_car),),
  7. ],
  8. )

6.indicatorWeight

设置选中Tab指示器线条的粗细


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. indicatorWeight: 5,
  4. tabs: [
  5. Tab(icon: Icon(Icons.directions_bike),),
  6. Tab(icon: Icon(Icons.directions_boat),),
  7. Tab(icon: Icon(Icons.directions_car),),
  8. ],
  9. )

7.indicatorPadding

设置选中Tab指示器间距,默认值为 EdgeInsets.zero


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. indicatorWeight: 5,
  4. indicatorPadding: EdgeInsets.only(bottom: 2),
  5. tabs: [
  6. Tab(icon: Icon(Icons.directions_bike),),
  7. Tab(icon: Icon(Icons.directions_boat),),
  8. Tab(icon: Icon(Icons.directions_car),),
  9. ],
  10. )

8.indicator

设置选中Tab指示器的外观


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. indicatorWeight: 5,
  4. indicatorPadding: EdgeInsets.only(bottom: 2),
  5. indicator: BoxDecoration(
  6. gradient: LinearGradient(colors: [
  7. Colors.orange,
  8. Colors.green
  9. ]),
  10. ),
  11. tabs: [
  12. Tab(icon: Icon(Icons.directions_bike),),
  13. Tab(icon: Icon(Icons.directions_boat),),
  14. Tab(icon: Icon(Icons.directions_car),),
  15. ],
  16. )

9.indicatorSize

设置选中Tab指示器的大小,该值是一个枚举类型,TabBarIndicatorSize.tab 跟随 Tab 的宽度,TabBarIndicatorSize.label 跟随 Tab 内容文字的宽度。


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. indicatorSize: TabBarIndicatorSize.tab,
  4. tabs: [
  5. Tab(icon: Icon(Icons.directions_bike),),
  6. Tab(icon: Icon(Icons.directions_boat),),
  7. Tab(icon: Icon(Icons.directions_car),),
  8. ],
  9. )

10.labelColor

设置选中Tab文字的颜色


  
  1. TabBar(
  2. indicatorColor: Colors.red,
  3. labelColor: Colors.pink,
  4. tabs: [
  5. Tab(icon: Icon(Icons.directions_bike),),
  6. Tab(icon: Icon(Icons.directions_boat),),
  7. Tab(icon: Icon(Icons.directions_car),),
  8. ],
  9. )

11.labelStyle

设置选中Tab文字的样式


  
  1. TabBar(
  2. labelStyle: TextStyle(
  3. backgroundColor: Colors.green,
  4. fontSize: 20
  5. ),
  6. tabs: [
  7. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  8. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  9. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  10. ],
  11. )

12.labelPadding

设置选中Tab内容的间距


  
  1. TabBar(
  2. labelStyle: TextStyle(
  3. backgroundColor: Colors.green,
  4. fontSize: 20
  5. ),
  6. labelPadding: EdgeInsets.all( 0),
  7. tabs: [
  8. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  9. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  10. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  11. ],
  12. )

13.unselectedLabelColor

设置未选中Tab文字的颜色


  
  1. TabBar(
  2. unselectedLabelColor: Colors.orange,
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  5. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  6. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  7. ],
  8. )

14.unselectedLabelStyle

设置未选中Tab文字的样式


  
  1. TabBar(
  2. unselectedLabelColor: Colors.orange,
  3. unselectedLabelStyle: TextStyle(
  4. backgroundColor: Colors.pink
  5. ),
  6. tabs: [
  7. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  8. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  9. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  10. ],
  11. )

15.dragStartBehavior

处理拖动开始行为的方式


  
  1. TabBar(
  2. unselectedLabelColor: Colors.orange,
  3. unselectedLabelStyle: TextStyle(
  4. backgroundColor: Colors.pink
  5. ),
  6. dragStartBehavior: DragStartBehavior.start,
  7. tabs: [
  8. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  9. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  10. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  11. ],
  12. )

16.overlayColor

定义响应焦点、悬停和飞溅颜色。

17.mouseCursor

鼠标指针进入或悬停在鼠标指针上时的光标,针对 Flutter web 应用


  
  1. TabBar(
  2. unselectedLabelColor: Colors.orange,
  3. unselectedLabelStyle: TextStyle(
  4. backgroundColor: Colors.pink
  5. ),
  6. mouseCursor: SystemMouseCursors.allScroll,
  7. tabs: [
  8. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  9. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  10. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  11. ],
  12. )

18.enableFeedback

检测到的手势是否应提供声音和/或触觉反馈,默认为 true


  
  1. TabBar(
  2. enableFeedback: true,
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  5. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  6. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  7. ],
  8. )

19.onTap

单击Tab时的回调


  
  1. TabBar(
  2. enableFeedback: true,
  3. onTap: (index) {
  4. print(index);
  5. },
  6. tabs: [
  7. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  8. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  9. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  10. ],
  11. )

20.physics

TabBar的滚动视图如何响应用户输入,

例如,确定在用户停止拖动滚动视图后滚动视图如何继续动画


  
  1. TabBar(
  2. physics: NeverScrollableScrollPhysics(),
  3. tabs: [
  4. Tab(icon: Icon(Icons.directions_bike), text: "单车",),
  5. Tab(icon: Icon(Icons.directions_boat), text: "轮船",),
  6. Tab(icon: Icon(Icons.directions_car), text: "汽车",),
  7. ],
  8. )


转载:https://blog.csdn.net/eastWind1101/article/details/127961345
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场