Flutter入门(14):Flutter 组件之 AppBar 详解

1. 基本介绍

AppBar 提供了常见的导航条功能。

2. 示例代码

代码下载地址。如果对你有帮助的话记得给个关注,代码会根据我的 Flutter 专题不断更新。

3. AppBar 属性

AppBar属性 介绍
leading 可以定制左上角按钮
automaticallyImplyLeading 是否自动导入左上角按钮,默认为 true,例如默认导入返回按钮
title AppBar 标题
actions 右上角功能按钮,可自定义
flexibleSpace 可折叠的应用栏,在改变 appBar 的 size 时有效果
bottom AppBar下方悬浮栏,可以看下文图片
elevation 阴影高度,默认为4.0
shadowColor 阴影颜色
shape 阴影 ShapeBorder
backgroundColor AppBar 背景色
brightness Brightness.dark 和 Brightness.light,改变上方电池,时间等状态栏颜色
iconTheme 所有 icon 的主题
actionsIconTheme actions 里的所有 icon 主题
textTheme text 主题
primary AppBar 是否在整个屏幕最上方,为 true 时,距离 AppBar 贴合状态栏下方,false 时,贴合整个屏幕最上方
centerTitle title 是否居中
excludeHeaderSemantics Whether the title should be wrapped with header [Semantics]. 默认为false,没太大用
titleSpacing title 距离左侧偏移量
toolbarOpacity AppBar 透明度
bottomOpacity bottom 透明度
toolbarHeight AppBar 高度

4. AppBar 组件

4.1 容器创建

优雅的编程,首先创建一个 appbar.dart 文件。

import 'package:flutter/material.dart';

class FMAppBarVC extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: _appBar(),
    );
  }

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
    );
 }
}
appbar title center.png

4.2 title

使用 Title 属性给 AppBar 设置标题,具体设置方法可以参考Flutter 组件之 Text 详解
使用 centerTitle 设置标题是否居中。

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      centerTitle: false,
    );
  }
appbar title left.png

4.3 actions

使用 actions 属性自定义 AppBar 右侧功能键。

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
    );
  }

  List<Widget> _actions(){
    return [
      Container(
        width: 50,
        color: Colors.green,
        child: Icon(Icons.image),
      ),
      Container(
        width: 50,
        color: Colors.greenAccent,
        child: Icon(Icons.accessible),
      ),
      Container(
        width: 50,
        color: Colors.grey,
        child: Icon(Icons.backspace),
      ),
      Container(
        width: 50,
        color: Colors.yellowAccent,
        child: Icon(Icons.battery_unknown),
      ),
    ];
  }
appbar actions.png

4.4 flexibleSpace

可折叠的应用栏,在改变 appBar 的 size 时有效果。

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      flexibleSpace: _flexibleSpaceBar(),
    );
  }

  FlexibleSpaceBar _flexibleSpaceBar(){
    return FlexibleSpaceBar(
      title: Text('FlexibleSpaceBar'),
    );
  }
appbar flexibleSpaceBar.png

4.5 leading

使用 leading 制定 appbar 左侧按钮。

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      // flexibleSpace: _flexibleSpaceBar(),
      leading: _leading(),
    );
  }

  Container _leading(){
    return Container(
      width: 50,
      color: Colors.yellow,
      child: Icon(Icons.favorite),
    );
  }
appbar leading.png

4.6 bottom

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      // flexibleSpace: _flexibleSpaceBar(),
      leading: _leading(),

      bottom: _preferredSize(),
    );
  }

  PreferredSize _preferredSize(){
    return PreferredSize(
      preferredSize: const Size.fromHeight(60),
      child: Container(
        color: Colors.greenAccent,
        height: 60,
      ),
    );
  }
appbar bottom.png

4.7 backgroundColor

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      // flexibleSpace: _flexibleSpaceBar(),
      // leading: _leading(),
      // bottom: _preferredSize(),
      // shadowColor: Colors.black,
      backgroundColor: Colors.grey,
    );
  }
appbar background grey.png

4.8 brightness

通过设置 brightness 改变上方,电池、时间...等图标颜色。

  AppBar _appBar() {
    return AppBar(
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.dark,
    );
  }
appbar brightness .png

appbar brightness light.png

4.9 toolbarHeight

通过 toolbarHeight 改变 appbar 高度。

  AppBar _appBar() {
    return AppBar(
      toolbarHeight: 90,
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.light,
    );
  }
appbar toolbarHeight.png

4.10 toolbarOpacity

通过 toolbarOpacity 改变 appbar 透明度。

  AppBar _appBar() {
    return AppBar(
      toolbarHeight: 90,
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.light,
      toolbarOpacity: 0.5,
    );
  }
appbar toolbarOpacity.png

4.11 iconTheme

使用 iconTheme 改变按钮主题。

  AppBar _appBar() {
    return AppBar(
      toolbarHeight: 90,
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.light,
      iconTheme: _iconThemeData(),
    );
  }

  IconThemeData _iconThemeData(){
    return IconThemeData(
      color: Colors.red,
      size: 40,
      opacity: 0.5,
    );
  }
appbar iconTheme.png

4.12 actionsIconTheme

使用 actionsIconTheme 改变 actions 按钮主题。注意与 iconTheme 的区别,iconTheme 改变了整个 appBar 的按钮,而 actions 仅仅改变 actions 按钮的主题。

  AppBar _appBar() {
    return AppBar(
      toolbarHeight: 90,
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.light,
      // iconTheme: _iconThemeData(),
      actionsIconTheme: _iconThemeData(),
    );
  }
appbar actionsIconTheme.png

4.13 textTheme

我试了好多种 TextTheme 设置,并没有发现哪有有变化,如果有思路欢迎私信。

4.14 titleSpacing

使用 titleSpacing 来控制 title 的左侧偏移量

  AppBar _appBar() {
    return AppBar(
      toolbarHeight: 90,
      titleSpacing: 40,
      title: Text(
        'AppBar',
        style: TextStyle(
          color: Colors.red,
        ),
      ),
      actions: _actions(),
      backgroundColor: Colors.grey,
      brightness: Brightness.light,
      // iconTheme: _iconThemeData(),
      actionsIconTheme: _iconThemeData(),
    );
  }
appbar titleSpacing.png

4.15 其他属性

其实 AppBar 还有一些属性,有兴趣可以自己研究一下。

5. 技术小结

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