MDC-101 Flutter:Material Design 元件基本概念

1. 簡介

什麼是 Material Design 和 Material Flutter 程式庫?

Material Design 是打造搶眼數位產品的系統。產品團隊只要遵循一致的原則和元件組合,將樣式、品牌宣傳、互動和動畫一貫化,就能實現最大的設計潛力。

Material Flutter 程式庫包含實作 Material Design 元件 (簡稱 MDC) 設計的 Flutter 小工具,可在不同應用程式和平台上提供一致的使用者體驗。隨著 Material Design 系統不斷演進,這些元件也會持續更新,確保像素導入作業一致,同時符合 Google 的前端開發標準。

在本程式碼研究室中,您將使用數個 Material Flutter 元件建構登入頁面。

建構項目

程式碼研究室之一,可引導您建構名為 Shrine 的電子商務應用程式,這個電子商務應用程式販售服飾和居家用品,並示範如何使用 Material Flutter 自訂元件,反映任何品牌或風格。

在本程式碼研究室中,您會建構 Shrine 的登入頁面,其中包含:

  • 神殿的標誌圖片
  • 應用程式名稱 (Shrine)
  • 兩個文字欄位,一個用於輸入使用者名稱,另一個則用於密碼
  • 兩個按鈕

Android

iOS

Android 裝置上的神社登入頁面

iOS 裝置上的神社登入頁面

本程式碼研究室中的 Material Flutter 元件和子系統

  • 文字欄位
  • 按鈕
  • 墨水漣漪 (觸控事件的視覺回饋形式)

針對 Flutter 開發經驗,您會給予什麼評價?

新手 中級 還算容易

2. 設定 Flutter 開發環境

您需要使用兩項軟體:Flutter SDK編輯器

您可以使用下列任一裝置執行程式碼研究室:

  • 將實體 AndroidiOS 裝置接上電腦,並設為開發人員模式。
  • iOS 模擬器 (需要安裝 Xcode 工具)。
  • Android Emulator (需要在 Android Studio 中設定)。
  • 瀏覽器 (必須使用 Chrome 進行偵錯)。
  • 下載 WindowsLinuxmacOS 桌面應用程式。您必須在要部署的平台上進行開發。因此,如果您想要開發 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

開啟專案並執行應用程式

  1. 在您選擇的編輯器中開啟專案。
  2. 按照操作說明「執行應用程式」。

大功告成!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」InputDecoration小工具。filled: 欄位代表文字欄位的背景會稍微填入背景,以便使用者辨識文字欄位中的輕觸或觸控目標區域。第二個文字欄位的 obscureText: true 值會自動將使用者輸入的內容替換成項目符號,這適用於密碼。

儲存專案 (使用按鍵動作:Command + s),執行熱重新載入

接著應該會顯示一個頁面,其中包含「使用者名稱」和「密碼」的兩個文字欄位!查看浮動標籤動畫:

Android

iOS

內有使用者名稱和密碼欄位的神社標誌

5. 新增按鈕

接著,我們會在登入頁面新增兩個按鈕:「取消」和「下一步」我們會使用兩種按鈕小工具:TextButtonElevatedButton

新增溢位 Bar

在文字欄位之後,將 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 會逐列排列子項。

新增按鈕

然後在 OverflowBarchildren 清單中新增兩個按鈕:

    // 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,

編輯按壓後編輯

新增指令以清除 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 元件小工具目錄中瀏覽其他類別。

或者,您也可以參閱「MDC-102:Material Design 結構和版面配置」,瞭解 MDC-102 中適用於 Flutter 的元件。

我可以在合理的時間內,完成本程式碼研究室

非常同意 同意 普通 不同意 非常不同意

我想日後繼續使用 Material Design 元件

非常同意 同意 普通 不同意 非常不同意