flutter的進階之路之Material Design與IOS風格元件

praise發表於2019-09-03

部落格

Material Design風格元件

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

Cupertino風格元件

1. 概述

Cupertino風格元件即IOS風格元件。主要有CupertinoTabBar、CupertinoPageScaffold、CupertinoTabScaffold、CupertinoTabView等。目前元件庫還沒有Material Design風格元件豐富。

2. CupertinoActivityIndicator元件

IOS風格loading指示器。

常用屬性

屬性名 型別 預設值 說明
radius double 10.0 載入圖形的半徑
animating bool true 是否播放載入動畫

3 CupertinoAlertDialog

與Material Design風格的AlertDialog類似。

常見屬性

屬性名 型別 說明
actions List<Widget> 對話方塊底部操作按鈕。如確定、取消。
title Widget 對話方塊標題,通常是一個文字
content Widget 對話方塊內容部分,通常為提示內容

3. CupertinoButton

IOS風格按鈕。

常用屬性

屬性名 型別 預設值 說明
color Color - 按鈕顏色
disableColor Color ThemeData.disabledColor 按鈕禁用狀態顏色
onPressed VoidCallback - 按鈕按下時回撥函式
child Widget - 按鈕的child通常為Text文字,顯示按鈕名字
enable bool true 是否為禁用狀態

4. Cupertino導航元件

4.1 CupertinoTabScaffold

選項卡元件,將選項卡按鈕與選項卡檢視繫結。

常用屬性

屬性名 型別 說明
tabBar CupertinoTabBar 選項卡按鈕,通常由圖示和文字組成
tabBuilder IndexedWidgetBuilder 選項卡檢視構造器

4.2 CupertinoTabBar

選項卡按鈕,通常由BottomNavigationBarItem組成包含圖示加文字。

常用屬性

屬性名 型別 說明
items List<BottomNavigationBarItem> 選項卡按鈕集合
backgroundColor Color 選項卡按鈕背景色
activeColor Color 選中按鈕前景色
iconSize double 選項卡圖示大小

4.3 CupertinoTabView

選項卡檢視。

常用屬性

屬性名 型別 說明
builder WidgetBuilder 選項卡檢視構造器
routes Map<String, WidgetBuilder> 選項卡檢視路由

4.4 CupertinoPageScaffold

頁面的基本佈局結構。包含內容和導航欄。

常用屬性

屬性名 型別 說明
backgroudColor Color 頁面背景色
navigationBar ObstructingPreferredSizeWidget 頂部導航欄按鈕。包含左中右三個子元件
child Widget 頁面的主要內容

4.5 CupertinoNavigationBar

導航欄結構元件。

常用屬性

屬性名 型別 說明
middle Widget 導航欄中間元件,通常為頁面標題
trailing Widget 導航欄右邊元件,通常為選單按鈕
leading Widget 導航欄左邊元件,通常為返回按鈕

相關文章