Flutter--AppBar组件和TabBar组件

一、AppBar介绍

AppBar:一个非常好用的导航条,一般为Scaffold这个组件appBar属性所用

二、AppBar源码

AppBar({
    Key key,
    this.leading,//导航条左边的组件
    this.automaticallyImplyLeading = true,//配合leading使用
    this.title,//标题
    this.actions,//导航条右边的组件数组
    this.flexibleSpace,//可伸展、折叠部件
    this.bottom,//导航条底部组件,一般配合TabBar使用
    this.elevation,//阴影高度
    this.shadowColor,//阴影颜色
    this.shape,//边框样式
    this.backgroundColor,//背景色
    this.brightness,//设置导航条顶部状态栏的亮度
    this.iconTheme,//图标样式
    this.actionsIconTheme,//actions样式
    this.textTheme,//文字样式
    this.primary = true,//是否沉浸在状态栏下
    this.centerTitle,//标题是否居中显示
    this.excludeHeaderSemantics = false,
    this.titleSpacing = NavigationToolbar.kMiddleSpacing,标题左右两边的间距
    this.toolbarOpacity = 1.0,//工具栏透明度
    this.bottomOpacity = 1.0,//底部透明度
    this.toolbarHeight,//工具栏高度
    this.leadingWidth,
  }) : assert(automaticallyImplyLeading != null),
       assert(elevation == null || elevation >= 0.0),
       assert(primary != null),
       assert(titleSpacing != null),
       assert(toolbarOpacity != null),
       assert(bottomOpacity != null),
       preferredSize = Size.fromHeight(toolbarHeight ?? kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),
       super(key: key);
20190618152106894.png

三、AppBar属性介绍

属性 说明
leading 导航条左边的组件
automaticallyImplyLeading 配合leading使用
automaticallyImplyLeading的值为true,leading为null,栈内还有别的页面,会默认添加BackButton按钮
automaticallyImplyLeading的值为true,leading不为null,无效
title 标题
actions 导航条右边的组件数组
flexibleSpace 可伸展、折叠部件
bottom 导航条底部组件,一般配合TabBar使用(TabBar的使用见下文)
elevation 阴影高度
shadowColor 阴影颜色
shape 边框样式
backgroundColor 背景色
brightness 导航栏顶部状态栏的样式
Brightness.dark白色
Brightness.light黑色
iconTheme 图标的样式,如果未设置actionsIconTheme,actions的样式也以iconTheme为主,设置了actionsIconTheme,actions的样式以actionsIconTheme为主
actionsIconTheme actions图标的样式
textTheme 文本的样式
primary 是否沉浸在状态栏下面,默认为true
false,沉浸在状态栏下面
centerTitle 标题是否居中
titleSpacing 标题左右两边的间距,默认为NavigationToolbar.kMiddleSpacing
toolbarOpacity 工具栏透明度,值为1.0完全不透明,值为0.0完全透明
bottomOpacity bottom透明度,值为1.0完全不透明,值为0.0完全透明
toolbarHeight 工具栏高度

三、AppBar的demo

return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            //导航条左边的组件
            leading: Icon(Icons.backspace_outlined),
            //配合leading使用
            automaticallyImplyLeading: false,
            //标题
            title: Text("AppBar学习"),
            //做折叠效果使用
//              flexibleSpace: FlexibleSpaceBar(),

            //导航条右边的一组组件
            actions: [
              Icon(Icons.settings),
              Icon(Icons.search),
              Icon(Icons.add_circle)
            ],
            //阴影
            elevation: 10,
            //阴影颜色
            shadowColor: Colors.yellow,
            //边框样式
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(10))),
            //背景色
            backgroundColor: Colors.red,
            //设置状态栏模式
            brightness: Brightness.dark,
            //设置图标的样式(颜色,不透明度和大小)
            iconTheme: IconThemeData(color: Colors.yellow),
            //设置actions图标的样式(颜色,不透明度和大小)
            actionsIconTheme: IconThemeData(color: Colors.purple),
            //设置文字的样式
            textTheme: TextTheme(),
            //是否沉浸在状态栏下,false会沉浸在状态栏下
            primary: true,
            //标题是否会显示在中间
            centerTitle: true,
            //标题左右两边的间距,默认为NavigationToolbar.kMiddleSpacing
            titleSpacing: NavigationToolbar.kMiddleSpacing,
            //工具栏透明度,值为1.0完全不透明,值为0.0完全透明
            toolbarOpacity: 1.0,
            //bottom透明度,值为1.0完全不透明,值为0.0完全透明
            bottomOpacity: 1.0,
            //工具栏高度
              toolbarHeight:40,
          ),
          body: Container()),
    );

a30146a72342989b866d538946d63d1.png

四、AppBar的bottom属性通常放TabBar组件,即添加一个Tab导航条

TabBar使用
①Scaffold外层需要添加DefaultTabController,有三个属性
length--tab的个数
initialIndex--默认选中tab的index
child--子组件
②必须给定length属性,length大小为tabs的个数

五、TabBar的源码

const TabBar({
    Key key,
    @required this.tabs,//tab组件数组
    this.controller,//tab控制器
    this.isScrollable = false,//是否可滚动
    this.indicatorColor,//指示器颜色
    this.indicatorWeight = 2.0,//指示器高度
    this.indicatorPadding = EdgeInsets.zero,//指示器内边距
    this.indicator,//指示器样式
    this.indicatorSize,//指示器宽度
    this.labelColor,//选中文本颜色
    this.labelStyle,//选中文本样式
    this.labelPadding,//文本内边距
    this.unselectedLabelColor,//未选中文本颜色
    this.unselectedLabelStyle,//未选中文本样式
    this.dragStartBehavior = DragStartBehavior.start,
    this.mouseCursor,
    this.onTap,//选中监听
    this.physics,
  }) : assert(tabs != null),
       assert(isScrollable != null),
       assert(dragStartBehavior != null),
       assert(indicator != null || (indicatorWeight != null && indicatorWeight > 0.0)),
       assert(indicator != null || (indicatorPadding != null)),
       super(key: key);

六、TabBar的属性介绍

属性 说明
tabs tab组件集合
controller tab控制器
isScrollable tabs是否可滚动,tabs的数量多的话,需要设置这个属性为true
indicatorColor 指示器颜色
indicatorWeight 指示器高度
indicatorPadding 指示器内边距
indicator 指示器样式,可以设置圆角,填充色等
indicatorSize 指示器宽度,有两种样式
TabBarIndicatorSize.tab和tab的宽度相同
TabBarIndicatorSize.label和文本的宽度相同
labelColor 选择文本的颜色
labelStyle 选中文本的样式
labelPadding 文本的内边距
unselectedLabelColor 未选中文本的颜色
unselectedLabelStyle 未选中文本的样式
onTap 选中监听

七、AppBar的bottom属性添加TabBar的demo

return MaterialApp(
        home: DefaultTabController(
      length: 9,
      initialIndex: 0,
      child: Scaffold(
          appBar: AppBar(
            title: Text("AppBar学习"),
            bottom: TabBar(
              //tab组件集合
              tabs: [
                Tab(text: "1111"),
                Tab(text: "2222"),
                Tab(text: "3333"),
                Tab(text: "4444"),
                Tab(text: "5555"),
                Tab(text: "6666"),
                Tab(text: "7777"),
                Tab(text: "8888"),
                Tab(text: "9999"),
              ],
              //tab是否可滚动
              isScrollable: true,
              //指示器颜色
              indicatorColor: Colors.red,
              //指示器高度
              indicatorWeight: 4,
              //指示器内边距
              indicatorPadding: EdgeInsets.all(10),
              //指示器样式
              indicator: BoxDecoration(
                  color: Colors.purple,
                  borderRadius: BorderRadius.all(Radius.circular(20))),
              //指示器宽度
              indicatorSize: TabBarIndicatorSize.tab,
              //文本颜色
              labelColor: Colors.amberAccent,
              //文本样式
              labelStyle: TextStyle(fontSize: 15),
              //文本内边距
              labelPadding:
                  EdgeInsets.only(left: 10, top: 0, right: 10, bottom: 0),
              //未选中文本的颜色
              unselectedLabelColor: Colors.orange,
              //未选中文本的样式
              unselectedLabelStyle: TextStyle(fontSize: 10),
              //回调监听
              onTap: (index) {
                print(index);
              },
            ),
          ),
          body: Container()),
    ));
f66e3af8704a44f2080c95c1383340a.png

八、去掉AppBar头部的,TabBar的demo

return MaterialApp(
        home: DefaultTabController(
      length: 4,
      initialIndex: 0,
      child: Scaffold(
          appBar: AppBar(
            title: TabBar(
              //tab组件集合
              tabs: [
                Tab(text: "1111"),
                Tab(text: "2222"),
                Tab(text: "3333"),
                Tab(text: "4444"),
              ],
              //tab是否可滚动
              isScrollable: true,
              //指示器颜色
              indicatorColor: Colors.red,
              //回调监听
              onTap: (index) {
                print(index);
              },
            ),

          ),
          body: TabBarView(
            children: [
              MyPage1(),
              MyPage2(),
              MyPage3(),
              MyPage4(),
            ],
          )

      ),
    ));
226f31f6e1b983c3f05489ae5922423.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容