1. 簡介
什麼是 Material Design 和 Material Flutter 程式庫?
Material Design 是一套系統,可協助您打造大膽且美觀的數位產品。只要在一致的原則和元件下整合樣式、品牌、互動和動態效果,產品團隊就能發揮最大的設計潛力。
Material Flutter 程式庫包含實作 Material Design 元件設計的 Flutter 小工具 (簡稱 MDC),可在應用程式和平台間提供一致的使用者體驗。隨著 Material Design 系統不斷演進,這些元件也會隨之更新,確保實作方式完全一致,並符合 Google 的前端開發標準。
在本程式碼研究室中,您將使用多個 Material Flutter 元件建構登入頁面。
建構項目
本程式碼研究室是四個程式碼研究室的第一個,將引導您建構名為「Shrine」的應用程式,這是一個販售服飾和居家用品的電子商務應用程式。並說明如何使用 Material Flutter 自訂元件,反映任何品牌或風格。
在本程式碼研究室中,您將為 Shrine 建構登入頁面,其中包含:
- Shrine 標誌的圖片
- 應用程式名稱 (Shrine)
- 兩個文字欄位,一個用於輸入使用者名稱,另一個用於輸入密碼
- 兩個按鈕
Android | iOS |
|
|
本程式碼研究室中的 Material Flutter 元件和子系統
- 文字欄位
- 按鈕
- 墨水漣漪 (觸控事件的視覺回饋形式)
您對 Flutter 開發的經驗程度如何?
2. 設定 Flutter 開發環境
如要完成本實驗室,您需要兩項軟體:Flutter SDK 和編輯器。
您可以使用下列任一裝置執行程式碼研究室:
- 連線至電腦並設為開發人員模式的實體 Android 或 iOS 裝置。
- iOS 模擬器 (需要安裝 Xcode 工具)。
- Android Emulator (需在 Android Studio 中設定)。
- 瀏覽器 (偵錯時必須使用 Chrome)。
- 以 Windows、Linux 或 macOS 電腦版應用程式的形式提供。您必須在要部署的平台上進行開發。因此,如要開發 Windows 桌面應用程式,您必須在 Windows 上開發,才能存取適當的建構鏈。如需作業系統專屬需求,請參閱 docs.flutter.dev/desktop。
3. 下載程式碼研究室的範例應用程式
範例專案位於 material-components-flutter-codelabs-101-starter/mdc_100_series 目錄中。
...或從 GitHub 複製
如要從 GitHub 複製本程式碼研究室,請執行下列指令:
git clone https://github.com/material-components/material-components-flutter-codelabs.git cd material-components-flutter-codelabs/mdc_100_series git checkout 101-starter
開啟專案並執行應用程式
- 在您選擇的編輯器中開啟專案。
- 按照所選編輯器的「開始使用:試用」一節中的「執行應用程式」操作說明操作。
太棒了,裝置上應正在執行 Shrine 登入頁面的啟動程式碼。您應該會看到 Shrine 標誌,以及標誌下方的「Shrine」名稱。
Android | iOS |
|
|
我們來看看程式碼。
小工具 login.dart
開啟 login.dart。其中應包含下列項目:
import 'package:flutter/material.dart';
class LoginPage extends StatefulWidget {
const LoginPage({Key? key}) : super(key: key);
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
// TODO: Add text editing controllers (101)
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 24.0),
children: <Widget>[
const SizedBox(height: 80.0),
Column(
children: <Widget>[
Image.asset('assets/diamond.png'),
const SizedBox(height: 16.0),
const Text('SHRINE'),
],
),
const SizedBox(height: 120.0),
// TODO: Remove filled: true values (103)
// TODO: Add TextField widgets (101)
// TODO: Add button bar (101)
],
),
),
);
}
}
請注意,其中包含 import 陳述式和兩個新類別:
import陳述式可讓您在這個檔案中使用 Material 程式庫。LoginPage類別代表模擬器中顯示的整個頁面。_LoginPageState類別的build()函式會控管 UI 中所有小工具的建立方式。
4. 新增 TextField 小工具
首先,我們會在登入頁面中加入兩個文字欄位,供使用者輸入使用者名稱和密碼。我們會使用 TextField 小工具,顯示浮動標籤並啟用觸控漣漪。
這個頁面主要採用 ListView 結構,可將子項排列在可捲動的欄中。讓我們在下方放置文字欄位。
新增 TextField 小工具
在 const SizedBox(height: 120.0) 後方新增兩個文字欄位和一個間隔。
// TODO: Add TextField widgets (101)
// [Name]
TextField(
decoration: const InputDecoration(
filled: true,
labelText: 'Username',
),
),
// spacer
const SizedBox(height: 120.0),
// [Password]
TextField(
decoration: const InputDecoration(
filled: true,
labelText: 'Password',
),
obscureText: true,
),
每個文字欄位都有 decoration: 欄位,可接受 InputDecoration 小工具。filled: 欄位表示文字欄位的背景已稍微填滿,有助於使用者辨識文字欄位的輕觸或觸控目標區域。第二個文字欄位的 obscureText: true 值會自動將使用者輸入的內容替換為圓點,適合用於密碼。
儲存專案 (使用鍵盤快速鍵:command + s),執行「熱重載」。
現在應該會看到一個頁面,其中有兩個文字欄位,分別是使用者名稱和密碼!請觀看浮動標籤動畫:
Android | iOS |
|
|
5. 新增按鈕
接著,我們會在登入頁面新增兩個按鈕:「取消」和「下一步」。我們會使用兩種按鈕小工具:TextButton 和 ElevatedButton。
新增 OverflowBar
在文字欄位後方,將 OverflowBar 新增至 ListView 的子項:
// TODO: Add button bar (101)
OverflowBar(
alignment: MainAxisAlignment.end,
// TODO: Add a beveled rectangular border to CANCEL (103)
children: <Widget>[
// TODO: Add buttons (101)
],
),
OverflowBar 會將子項排列成一列。
新增按鈕
接著在 OverflowBar 的 children 清單中新增兩個按鈕:
// TODO: Add buttons (101)
TextButton(
child: const Text('CANCEL'),
onPressed: () {
// TODO: Clear the text fields (101)
},
),
// TODO: Add an elevation to NEXT (103)
// TODO: Add a beveled rectangular border to NEXT (103)
ElevatedButton(
child: const Text('NEXT'),
onPressed: () {
// TODO: Show the next page (101)
},
),
儲存專案。最後一個文字欄位下方會顯示兩個按鈕:
Android | iOS |
|
|
OverflowBar 會為您處理版面配置工作。按鈕會水平放置,並排顯示。
輕觸按鈕會啟動墨水漣漪動畫,但不會觸發其他動作。我們在匿名 onPressed: 函式中新增功能,讓取消按鈕清除文字欄位,下一個按鈕則會關閉畫面:
新增 TextEditingController
為了能夠清除文字欄位的值,我們會新增 TextEditingControllers 來控制文字。
在 _LoginPageState 類別的宣告正下方,將控制器新增為 final 變數。
// TODO: Add text editing controllers (101)
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
在第一個文字欄位的 controller: 欄位中,設定 _usernameController:
// TODO: Add TextField widgets (101)
// [Name]
TextField(
controller: _usernameController,
在第二個文字欄位的 controller: 欄位中,現在請設定 _passwordController:
// TODO: Add TextField widgets (101)
// [Password]
TextField(
controller: _passwordController,
編輯 onPressed
在 TextButton 的 onPressed: 函式中新增指令,清除每個控制器:
// TODO: Clear the text fields (101)
_usernameController.clear();
_passwordController.clear();
儲存專案。現在,當您在文字欄位中輸入內容時,按下「取消」會再次清除每個欄位。
這個登入表單狀態良好!現在要讓使用者進入 Shrine 應用程式的其餘部分。
流行
如要關閉這個檢視畫面,我們需要從導覽堆疊中移除 (或移除) 這個頁面 (Flutter 稱為「路徑」)。
在 ElevatedButton 的 onPressed: 函式中,從 Navigator 彈出最近的路線:
// TODO: Show the next page (101)
Navigator.pop(context);
最後,開啟 home.dart,並在 Scaffold 中將 resizeToAvoidBottomInset 設為 false:
return Scaffold(
// TODO: Add app bar (102)
// TODO: Add a grid view (102)
body: Center(
child: Text('You did it!'),
),
// TODO: Set resizeToAvoidBottomInset (101)
resizeToAvoidBottomInset: false,
);
這麼做可確保鍵盤不會改變首頁或小工具的大小。
大功告成!儲存專案。然後按一下「下一步」。
你們成功了!
Android | iOS |
|
|
這個畫面是下一個程式碼研究室的起點,您將在 MDC-102 中處理這個畫面。
6. 恭喜!
我們新增了文字欄位和按鈕,幾乎不必考慮版面配置程式碼。Flutter 適用的 Material 元件提供許多樣式,幾乎不費吹灰之力就能放置在畫面上。
後續步驟
文字欄位和按鈕是 Material 系統的兩個核心元件,但還有更多元件!您也可以在 Material Components 小工具目錄中探索其餘部分。
或者,您也可以前往 MDC-102:Material Design 結構和版面配置,瞭解 MDC-102 中涵蓋的 Flutter 元件。









