Flutter Widget(5):MaterialDesign風格Widget

1. 概述

Material Design是由谷歌推出的全新設計語言,這種設計語言旨在為手機、平板電腦、臺式機和其他平臺提供更一致、更廣泛的外觀和感覺。Material Design風格是一直非常有質感的設計風格,并會提供一些默認的交互動畫。

2. App結構和導航組件

2.1 MaterialApp(應用組件)

MaterialApp代表使用Material Design風格的應用,里面包含了其他所需的基本控件。官方提供的示例demo就是從MaterialApp這個主組件開始的。

MaterialApp組件常見屬性

屬性名 類型 說明
title String 應用程序的標題。該標題出現在以下位置:Android:任務管理器的程序快照上; IOS:程序切換管理器中
theme ThemeData 定義應用所使用的主題顏色,可以指定主題中每個控件的顏色
color Color 應用的主要顏色值,即primary color
home Widget 用來定義當前應用打開時所顯示的界面
routes Map<String, WidgetBuilder> 定義應用中頁面跳轉規則
initialRoute String 初始化路由
onGenerateRoute RouteFactory 路由回調函數。當通過Navigator.of(context).pushNamed跳轉路由的時候,在routes查找不到時,會調用該方法
onLocaleChanged - 當系統修改語言的時候,會觸發這個回調
navigatorObservers List<NavigatorObserver> 導航觀察器
debugShowMaterialGrid bool 是否顯示布局網格,用來調試UI的工具
showPerformanceOverlay bool 顯示性能標簽

2.1.1 設置主頁

使用home屬性設置應用的主頁,即整個應用的主組件。

2.1.2 路由處理

routes對象是一個Map<String, WidgetBuilder>。當使用Navigator.pushNamed來跳轉路由的時候,通過routes查找路由名字,然后使用對應的WidgetBuilder來構造一個帶有頁面切換動畫的MaterialPageRoute。如果應用只有一個界面,則不用設置整個屬性,使用home即可。

2.1.3 自定義主題

應用程序的主題,各種定制的顏色都可以設置,用于程序主題切換。

2.2 Scaffold(腳手架組件)

Scaffold實現了基本的Material Design布局。只要是在Material Design中定義過的單個界面顯示的布局組件元素,都可以使用Scaffold來繪制。

常用屬性

屬性名 類型 說明
appBar AppBar 顯示在界面頂部的一個AppBar
body Widget 當前界面所顯示的主要內容
floatingActionButton Widget 在Material Design中定義的一個功能按鈕
persistentFooterButtons List< Widget> 固定在下方顯示的按鈕
drawer Widget 側邊欄組件
bottomNavigatorBar Widget 顯示在底部的導航欄
backgroudColor Color 背景顏色
resizeToAvoidBottomPadding bool 控制界面內容body是否重新布局來避免底部被覆蓋,比如當鍵盤顯示時,重新布局避免鍵盤蓋住內容。默認為true

2.3 AppBar(應用按鈕組件)

應用按鈕組件有AppBar和SliverAppBar。它們是Material Design中的AppBar,也就是Android中的ToolBar。
AppBar和SliverAppBar都繼承自StatefulWidget,兩者的區別在于AppBar的位置是固定在應用最上面的;而SliverAppBar是可以跟隨內容滾動的。

常用屬性

屬性名 類型 默認值 說明
leading Widget null 在標題前面顯示一個組件,在首頁通常顯示應用的logo;其他界面通常顯示返回按鈕
title Widget null 當前界面的標題
actions List<Widget> null 一個Widget列表,常用菜單通常使用IconButton,不常用的通常使用PopupMenuButton顯示三個點,點擊后彈出二級菜單
bottom PreferredSizeWidget null 通常是一個TabBar。用來在標題下方顯示一個Tab導航欄
elevation double 4 控制AppBar下方陰影的高度
flexibleSpace Widget null 一個顯示在AppBar下方的組件,高度和AppBar一樣,可以實現一些特殊的效果,該屬性通常在SliverAppBar中使用
backgroundColor Color ThemeData.primaryColor 背景色
brightness Brightness ThemeData.primaryColorBrightness AppBar的亮度,有白色和黑色兩種主題
iconTheme IconThemeData ThemeData.primaryIconTheme AppBar上圖標的顏色、透明度和尺寸信息
textTheme TextTheme ThemeData.primaryTextTheme AppBar上文字樣式
centerTitle bool - 標題是否居中顯示,不同操作系統,顯示方式不一樣

2.4 BottomNavigatorBar(底部導航欄)

BottomNavigatorBar是底部導航欄,可以很容易地在tab之間切換和瀏覽頂級視圖。

常見屬性

屬性名 類型 說明
currentIndex int 當前索引
fixedColor Color 選中按鈕的顏色。不指定則使用系統主題色
iconSize double 按鈕圖形大小
items List<BottomNavigatorBarItem> 底部導航欄按鈕集。每一項是一個BottomNavigatorBarItem,包含icon圖標和title文本
onTap ValueChanged<int> 按下按鈕的回調事件。需要根據返回的索引設置當前索引

2.5 TabBar(水平選項卡及視圖組件)

TabBar是一個顯示水平選項卡的Material Design組件,通常需要配套Tab選項組件及TabBarView頁面視圖組件一起使用。
TabBar常見屬性

屬性名 類型 說明
isScrolled bool 是否可以水平滾動
tabs List<Widget> Tab選項列表

Tab常見屬性

屬性名 類型 說明
icon Widget Tab圖標
text String Tab文本

TabBarView常見屬性

屬性名 類型 說明
controller TabController 指定視圖的控制器
childrens List<Widget> 視圖組件的child為一個列表,一個選項卡對應一個視圖

2.6 Drawer(抽屜組件)

Drawer可以實現類似抽屜拉入推出的效果,通常與ListView組合使用。

Drawer常用屬性

屬性名 類型 默認值 說明
child Widget - Drawer的child可以放置任意可顯示的組件
elevation double 16 陰影尺寸

Drawer可以添加頭部效果:

  • DrawerHeader:展示基本信息
  • UserAccountsDrawerHeader:展示用戶頭像、用戶名、Email等信息

DrawerHeader常用屬性

屬性名 類型 說明
decoration Decoration header區域的decoration,通常用來設置背景顏色或背景圖片
curve Curve 如果decoration發生了變化,則會使用curve設置的變化曲線和duration設置的動畫時間來做一個動畫效果
child Widget Header里面所顯示的內容控件
padding EdgeInsetsGeometry Header里面內容控件的padding值,如果child為null,該值無效
margin EdgeInsetsGeometry Header四周的間隙

UserAccountsDrawerHeader常用屬性

屬性名 類型 說明
margin EdgeInsetsGeometry Header四周的間隙
decoration Decoration header區域的decoration,通常用來設置背景顏色或背景圖片
currentAccountPicture Widget 用來設置當前用戶的頭像
otherAccountsPicture Widget 用來設置當前用戶其他賬號的頭像
accountName Widget 當前用戶的名字
accountEmail Widget 當前用戶的Email
onDetailsPressed VoidCallback 當accountName或者accountEmail被點擊的時候所觸發的回調函數,可以用來顯示其他額外的信息

3. 按鈕和提示組件

3.1 FloatingActionButton(懸停按鈕組件)

FloatingActionButton對應一個圓形圖標按鈕,懸停在內容之上,以展示應用程序中的主要動作。類似IOS里的小白點。

FloatingActionButton常用屬性

屬性名 類型 默認值 說明
child - - -
tooltip - - -
foregroundColor - - -
backgroundColor - - -
elevation - - -
highlightElevation - - -
onPressed - - -
shape - - -

3.2 FlatButton(扁平按鈕組件)

FlatButton是一個扁平的Material Design風格的按鈕,點擊時會有一個陰影效果。

3.3 PopupMenuButton(彈出菜單組件)

PopupMenuButton一般放在應用右上角,表示更多操作,菜單項使用PopupMenuItem組件。

PopupMenuButton常用屬性

屬性名 類型 說明
child - -
icon - -
itemBuilder - -
onSelected - -

3.4 SimpleDialog(簡單對話框組件)

SimpleDialog用于設計簡單的對話框,可以顯示附加的提示或操作。SimpleDialog通常需要配合SimpleDialogOption組件一起使用。

SimpleDialog常用屬性

屬性名 類型 說明
children List<Widget> 對話框子項
title Widget 通常是一個文本控件
contentPadding EdgeInsetsGeometry 內容部分間距
titlePadding EdgeInsetsGeometry 標題部分間距
  • 通常對話框都是由某個動作來觸發渲染的,比如點擊按鈕,點擊菜單等。所以對話框一般要封裝在一個方法里實現。
  • 另外這個過程是異步的需要加入async/await處理。

3.5 AlertDialog(提示對話框組件)

AlertDialog比SimpleDialog對話框又復雜一些,不僅有提示內容,還有一些操作按鈕,如確定和取消等,內容部分可以用SingleChildScrollView進行包裹。

AlertDialog常用屬性

屬性名 類型 說明
actions List<Widget> 對話框底部操作按鈕,如確定、取消等
title Widget 通常是一個文本控件
contentPadding EdgeInsetsGeometry 內容部分間距
content Widget 內容部分,通常為對話框的提示內容
titlePadding EdgeInsetsGeometry 標題部分間距

3.6 SnackBar(輕量提示組件)

SnackBar是一個輕量級消息提示組件,在屏幕底部顯示。

SnackBar常用屬性

屬性名 類型 默認值 說明
action SnackBarAction - 提示消息里執行的動作,比如用戶想撤銷時可以點擊操作
animation Animation<double> - 給組件添加動畫效果
content Widget - 提示消息內容,通常為文本組件
duration Duration 4.0秒 動畫執行的時長
backgroundColor Color - 消息面板的背景色

4. 其他組件

4.1 TextField(文本框組件)

TextField就是用來做文本輸入的組件。

  • 注意與Text組件區分,Text主要用于顯示文本,不接受文本輸入。

TextField常用屬性

屬性名 類型 說明
maxLength int 最大長度
maxLines int 最大行數
autocorrect bool 是否自動更正
autofocus bool 是否自動對焦
obscureText bool 是否是密碼
textAlign TextAlign 文本對齊方式
style TextStyle 文本的樣式
inputFormatters List<TextInputFormatter> 允許的輸入格式
onChanged VoidChanged<String> 內容改變時回調
onSubmitted VoidChanged<String> 內容提交時回調
enabled bool 是否禁用

4.2 Card(卡片組件)

Card內容可以由大多數類型的組件構成,但通常與ListTitle一起使用。Card有一個child,但可以是支持多個child的Row、Column、ListView、GridView或其他小部件。默認情況下,Card將其大小縮小為0像素。可以使用SizedBox來限制Card的大小。

Card常用屬性

屬性名 類型 默認值 說明
child Widget - 組件的子元素,任意Widget都可以
margin EdgeInsetsGeometry - 圍繞在decoration和child之外的空白區域,不屬于內容區域
shape ShapeBorder RoundedRectangleBorder Card的陰影效果,默認的陰影效果為圓角的長方形邊。弧度為4.0
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容