Flutter深入淺出元件篇---AppBar

Jimi發表於2021-08-23

AppBar介紹

​ AppBar是基於Material Design設計風格的應用欄,一般使用在Scaffold內部,作為頂部導航欄。

為什麼需要AppBar

​ 1、因為導航欄裡面一般由左側功能鍵(返回鍵、選單鍵)、標題、右側功能鍵組成,而AppBar裡面內建封裝了這些元件,使用起來非常方便。

​ 2、可以做一些特殊的導航欄,比如可滾動的導航欄。

​ 3、根據環境 MediaQuery 的填充插入內容,以避免系統 UI 入侵。

示例程式碼

本文中很多效果都沒有截圖,可下載原始碼執行專案 原始碼地址,或者通過視訊教程檢視 視訊教程地址

AppBar屬性和說明

總共28個屬性

欄位屬性描述
keyKey當元件在元件樹中移動時使用Key可以保持元件之前狀態
leadingWidget通常情況下返回一個返回鍵(IconButton)
leadingWidthdouble左側leading的寬度,預設56
automaticallyImplyLeadingbool和leading配合使用,如果為true並且leading為空的情況下,會自動配置返回鍵
titleWidget導航欄的標題
centerTitlebool標題是否居中,不同作業系統預設顯示位置不一樣
actionsList一個Widget列表
bottomPreferredSizeWidget出現在導航欄底部的控制元件
elevationdouble控制導航欄下方陰影的大小
shadowColorColor控制導航欄下方陰影的顏色
shapeShapeBorder導航欄的形狀以及陰影
backgroundColorColor導航欄的背景顏色
foregroundColorColor導航欄中文字和圖示的顏色
backwardsCompatibilitybool與foregroundColor配合使用
iconThemeIconThemeData導航欄圖示的顏色、透明度、大小的配置
actionsIconThemeIconThemeData導航欄右側圖示的顏色、透明度、大小的配置
textThemeTextTheme導航欄文字的排版樣式
primarybool導航欄是否顯示在螢幕頂部
excludeHeaderSemanticsbool標題是否應該用 [Semantics] 包裹,預設false
titleSpacingdoubletitle內容的間距
toolbarOpacitydouble導航欄的透明度
bottomOpacitydouble導航欄底部的透明度
toolbarHeightdouble導航欄的高度,預設kToolbarHeight
toolbarTextStyleTextStyle導航欄圖示的顏色
titleTextStyleTextStyle導航欄標題的預設顏色
flexibleSpaceWidget堆疊在工具欄和選項卡欄的後面
systemOverlayStyleSystemUiOverlayStyle疊加層的樣式
brightnessBrightness導航欄的亮度,改屬性已廢棄,用systemOverlayStyle代替

AppBar詳細使用

1、key

key 是用來作為WidgetElementSemanticsNode 的標識,當元件在元件樹中移動時使用Key可以保持元件之前狀態。

使用方法

GlobalKey _appBarKey = GlobalKey();

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      key: _appBarKey,
    ),
  );
}
複製程式碼

2、leading

appBar 左側顯示的一個 Widget,一般顯示返回鍵 IconIconButton

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      leading: IconButton(
        onPressed: (){
          Navigator.pop(context);
        }, 
        icon: Icon(Icons.arrow_back_sharp, color: Colors.white,)
      ),
    ),
  );
}
複製程式碼

3、leadingWidth

​ 左側leading的寬度,預設56

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      leading: IconButton(
        onPressed: (){
          Navigator.pop(context);
        }, 
        icon: Icon(Icons.arrow_back_sharp, color: Colors.white,)
      ),
      leadingWidth: 60,
    ),
  );
}
複製程式碼

4、automaticallyImplyLeading

​ 當leading 未配置時,在二級頁面下會自動展示一個返回鍵,預設值為 true

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      automaticallyImplyLeading: false,
    ),
  );
}
複製程式碼

5、title

​ 導航欄的標題,一般是顯示當前頁面的標題文字

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("AppBarExample"),
    ),
  );
}
複製程式碼

6、centerTitle

​ 標題是否居中,不同作業系統預設顯示位置不一樣,安卓預設顯示在左側,蘋果預設顯示在中間

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("AppBarExample"),
      centerTitle: true,
    ),
  );
}
複製程式碼

7、actions

​ 一個 Widget 列表,代表 Toolbar 中所顯示的選單,對於常用的選單,通常使用 IconButton 來表示;對於不常用的選單通常使用 PopupMenuButton 來顯示為三個點,點選後彈出二級選單

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      actions: [
        IconButton(
          onPressed: (){

          },
          tooltip: "掃一掃",
          icon: Icon(Icons.qr_code_scanner),
        ),
        IconButton(
          onPressed: (){

          },
          tooltip: "新增",
          icon: Icon(Icons.add),
        )
      ],
    ),
  );
}
複製程式碼

8、bottom

​ 出現在應用欄底部的控制元件,一般是 TabBar

使用方法

import 'package:flutter/material.dart';

class AppBarExample extends StatefulWidget {
  @override
  _AppBarExampleState createState() => _AppBarExampleState();
}

class _AppBarExampleState extends State<AppBarExample> with SingleTickerProviderStateMixin{

  TabController _tabController;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _tabController = TabController(length: 2, vsync: this);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: [
            Tab(text: "火車", icon: Icon(Icons.bus_alert),),
            Tab(text: "汽車", icon: Icon(Icons.bus_alert),)
          ],
        ),
      ),
    );
  }
}

複製程式碼

9、elevation

​ 控制應用欄下方陰影的大小,這個值不能是一個負值。

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      elevation: 10,
    ),
  );
}
複製程式碼

10、shadowColor

​ 控制導航欄下方陰影的顏色

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      elevation: 10,
      shadowColor: Colors.green,
    ),
  );
}
複製程式碼

11、shape

​ 導航欄的形狀以及陰影

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      elevation: 10,
      shadowColor: Colors.green,
      shape: RoundedRectangleBorder(
        side: BorderSide(
          color: Colors.red,
          width: 5
        )
      )
    ),
  );
}
複製程式碼

12、backgroundColor

​ 導航欄的背景顏色

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backgroundColor: Colors.orange,
    ),
  );
}
複製程式碼

13、foregroundColor

​ 導航欄中文字和圖示的顏色

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      foregroundColor: Colors.black,
    ),
  );
}
複製程式碼

14、backwardsCompatibility

​ 與foregroundColor配合使用

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      foregroundColor: Colors.black,
      backwardsCompatibility: true,
    ),
  );
}
複製程式碼

15、iconTheme

​ 導航欄圖示的顏色、透明度、大小的配置

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      leading: IconButton(
        onPressed: (){
          Navigator.pop(context);
        }, 
        icon: Icon(Icons.arrow_back_sharp, color: Colors.white,)
      ),
      iconTheme: IconThemeData(
        color: Colors.orange,
        opacity: 1,
        size: 50
      ),
    ),
  );
}
複製程式碼

16、actionsIconTheme

​ 導航欄右側圖示的顏色、透明度、大小的配置

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      actions: [
        IconButton(
          onPressed: (){

          },
          tooltip: "掃一掃",
          icon: Icon(Icons.qr_code_scanner),
        ),
        IconButton(
          onPressed: (){

          },
          tooltip: "新增",
          icon: Icon(Icons.add),
        )
      ],
      actionsIconTheme: IconThemeData(
        color: Colors.purple,
      ),
    ),
  );
}
複製程式碼

17、textTheme

​ 導航欄文字的排版樣式,預設使用ThemeData.primaryTextTheme

18、primary

​ 導航欄是否顯示在螢幕頂部

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backrogoundColor: Colors.black,
      primary: true,
    ),
  );
}
複製程式碼

19、excludeHeaderSemantics

​ 標題是否應該用 [Semantics] 包裹,預設false

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backrogoundColor: Colors.black,
      primary: true,
      excludeHeaderSemantics: true,
    ),
  );
}
複製程式碼

20、titleSpacing

​ 標題內容的間距,如果為0,將佔用全部空間

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("AppBarExample"),
      centerTitle: true,
      titleSpacing: 0,
    ),
  );
}
複製程式碼

21、toolbarOpacity

​ 導航欄的透明度

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backrogoundColor: Colors.black,
      toolbarOpacity: 0.5,
    ),
  );
}
複製程式碼

22、bottomOpacity

​ 導航欄底部的透明度

使用方法

import 'package:flutter/material.dart';

class AppBarExample extends StatefulWidget {
  @override
  _AppBarExampleState createState() => _AppBarExampleState();
}

class _AppBarExampleState extends State<AppBarExample> with SingleTickerProviderStateMixin{

  TabController _tabController;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _tabController = TabController(length: 2, vsync: this);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: [
            Tab(text: "火車", icon: Icon(Icons.bus_alert),),
            Tab(text: "汽車", icon: Icon(Icons.bus_alert),)
          ],
        ),
				bottomOpacity: 0.5,
      ),
    );
  }
}
複製程式碼

23、toolbarHeight

​ 導航欄的高度,預設kToolbarHeight

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backrogoundColor: Colors.black,
      toolbarHeight: 200,
    ),
  );
}
複製程式碼

24、toolbarTextStyle

​ 導航欄圖示的顏色

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      leading: IconButton(
        onPressed: (){
          Navigator.pop(context);
        }, 
        icon: Icon(Icons.arrow_back_sharp, color: Colors.white,)
      ),
      toolbarTextStyle: TextStyle(
        color: Colors.black
      ),
    ),
  );
}
複製程式碼

25、titleTextStyle

​ 導航欄標題的預設顏色

使用方法

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("AppBarExample"),
      centerTitle: true,
      titleSpacing: 0,
      titleTextStyle: TextStyle(
        color: Colors.red
      ),
    ),
  );
}
複製程式碼

26、flexibleSpace、systemOverlayStyle、brightness

flexibleSpace 以及 systemOverlayStyle 一般都是在配合 SliverAppBar 使用的,這裡不做過多的描述。而 brightness 已經廢棄,用 systemOverlayStyle 代替。

總結

以上是針對 AppBar 的所有使用方法,最常用的屬有leadingtitleactionscenterTitlebottombackgroundColor,其他屬性都是在特定的情況才會使用。

相關文章