iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Mobile Development

Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!系列 第 26

[ Day 26 ] Flutter UI 實戰應用篇 — 生活在地球的勇者啊,怎麼見極樂世界呀?(2)

  • 分享至 

  • xImage
  •  

2025 iThome鐵人賽
「 Flutter :30天打造念佛App,跨平台從Mobile到VR,讓極樂世界在眼前實現 ! 」
Day 26
「 Flutter UI 實戰應用篇 生活在地球的勇者啊,怎麼見極樂世界呀 ? (2)


《佛說阿彌陀經》:

又舍利弗。極樂國土,有七寶池,八功德水,充滿其中,池底純以金沙布地。四邊階道,金、銀、琉璃、玻璃合成。上有樓閣,亦以金、銀、琉璃、玻璃、硨磲、赤珠、瑪瑙而嚴飾之。池中蓮花大如車輪,青色青光、黃色黃光、赤色赤光、白色白光,微妙香潔。

白話:
舍利弗,極樂世界有七種寶物構成的七寶池,
由具備八種功德的水注滿七寶池,池底全是金沙遍佈滿地。

池邊周圍的台階與道路,由金、銀、琉璃、玻璃構成。
街道上的樓房,也都由金、銀、琉璃、玻璃、硨磲、赤珠、瑪瑙 莊嚴地佈置裝飾。

七寶池中的蓮花,大小如馬車的車輪,青色蓮花綻放青色光芒,黃色蓮花綻放黃色光芒,紅色蓮花綻放紅色光芒,白色蓮花綻放白色光芒,蓮花質地精微神妙且芬芳清淨。

前言

昨天我們已經初步認識「 UX&UI 設計流程」、「 Logic Flow 操作邏輯流程」、「 Wireframe 線框稿」,今天我們要接著一起認識 App Human Interface Guidelines、Google Material Design,並且了解 flutter 開發建議採用的設計指南與各平台 UI 相關的送審事項 !

Day26 文章目錄:
一、Human Interface Guidelines
二、Material Design
三、Material Design for Flutter


一、Human Interface Guidelines

1. 簡介

Human Interface Guidelines(HIG)是 Apple 官方提供
蘋果生態系(iOS、iPadOS、macOS等)開發的設計規範指引。

內容涵蓋:設計原則、版面(Layout)、互動與動態、元件、無障礙,
以及各平台特有的模式(如分割畫面、選單、導覽)。

目標是:協助開發者做出符合蘋果生態系習慣、直覺、一致性的產品。

2. 重點

主題 重點 Do Don’t
Layout(安全區 × 適應性) 安全區(safe areas)、尺寸與視窗變化是所有畫面穩定與通用性的基礎;要先處理間距與可用區域,再談視覺。 使用安全區與系統間距、讓版面自適應。 避免硬編固定尺寸或忽略瀏海/工具列。
Materials:Liquid Glass 2025 新材質,提供半透明、環境感知的層次與空間;可強化定位感但要注意可讀性與對比。 把 Liquid Glass 當成層級工具;確保文字/控制與背景對比。 避免過度透明導致訊息不清。
Color(外觀與對比) 必須同時在淺色/深色外觀維持充足對比與一致的品牌辨識;材質變化會影響背景與色彩感受。 在兩種外觀都做對比檢查。 避免只在單一背景測試。
Typography(Dynamic Type × 系統字型) Dynamic Type 直接影響可讀性與無障礙;優先用 SF 系列/官方字型,讓大小/字距在各平台正確縮放。 支援 Dynamic Type、用系統字型。 避免鎖死字距/行高或嵌入非必要客製字體。
Navigation & Search 目標是最少步驟完成常見任務 把核心任務放一兩步可達;善用分頁/搜尋元件。 避免把稀有功能放在一級導覽。
App Icons(分層圖標 × Icon Composer) 2025 起支援分層圖標與 Liquid Glass 效果;Icon Composer可一稿產出多平台規格並預覽外觀。 遵循分層與環境效果規則;在 Composer 中檢視各外觀。 避免把照片或長文字當圖標主體。
Lists & Tables(資訊密度與層級) 列表/表格是最常見資訊呈現:要有清楚的層級、足夠行高與點擊區 用副標/輔助字描述狀態;適度分隔。 避免把互動控件塞滿每列。
Accessibility(無障礙) 以可感知、可操作、可理解為原則;支援 VoiceOver、動態字級、充分對比與可點觸目標。 語意標籤、支援輔助功能。 避免只用顏色傳達狀態。

3. 送審相關事項

2.1 App Completeness
placeholder text, empty websites, and other temporary content should be scrubbed before submission.

送審前,必須移除所有佔位文字、空白網站/頁面以及其他臨時內容。

2.3 Accurate Metadata
don’t include names, icons, or imagery of other mobile platforms or alternative app marketplaces in your app or metadata, unless there is specific, approved interactive functionality.

除非具有具體且已核准的互動功能,
否則不得在 App 或中繼資料中加入其他行動平台或替代應用程式市集的名稱、圖示或圖像。

5.1.1 Data Collection and Storage
(v) Account Sign-In:If your app doesn’t include significant account-based features, let people use it without a login. If your app supports account creation, you must also offer account deletion within the app.

如果 App 不包含重要的帳戶導向功能,就應該允許使用者不登入也能使用。
若 App 支援建立帳戶,也必須在 App 內提供刪除帳戶的功能。

審核面向 UI 相關審核 注意要點
介面完整度(App 完整性) 是否有Placeholder、假資料、未連線的頁面或按鈕 Demo 帳號未提供/服務未開、按了沒反應、無效連結
介面品質(Substandard UI) 介面是否清楚、精緻、易用,遵循 iOS 慣例 佈局凌亂、互動不直覺 → 以「介面品質不足」退回
螢幕截圖與展示圖 商店頁截圖是否真實反映 UI、機型對應正確 合成圖遮住重點、用錯裝置外框、與實際 UI 不符
最低功能性 App 是否有原生價值、不只是 Web Clipping 或連結集合 單純包網頁、內容聚合而無原生體驗
重複/模板化 App 與其他app 幾乎相同 同類多個「換皮」App 重複送審
登入與帳號刪除 UI 若支援註冊,App 內要能發起帳號刪除;若非必要,不硬性登入 僅提供停用/客服信箱、刪除流程藏太深、非必要卻強制登入
Apple Pay / 付款相關 UI Apple Pay 按鈕/標誌使用正確;付款資訊清楚透明 用到 Apple Pay 卻亂改按鈕樣式、流程資訊不完整
其他平台品牌/識別 不得在名稱、圖示、截圖使用他牌平台名稱/圖像 App 名稱或截圖放 Android、Windows 等字樣/圖像
導航與自適應佈局 符合 iOS 導航慣例(返回、分頁)、安全區與自適應 自製導航不一致、內容被瀏海/Home 指示條遮擋
可讀性與無障礙 文字大小、對比度、動態型態、VoiceOver 文字過小/對比過低、未支援字級放大

二、Material Design

1. 簡介

Material Design 是 Google 推出的跨平台設計系統,
內容涵蓋:設計哲學、排版與色彩規範、元件庫、動態規則、無障礙指引等,
目標是:協助開發者做出跨平台與裝置的 UI 最佳實踐。

2. 重點

15 種字體比例

Design Token

主題 重點 Do Don’t
設計代幣(Design Tokens) 讓設計與程式「同一語言」:顏色、字級、圓角、陰影高度等都用 token 名稱取代硬編值。 token 化色彩/字體/圓角/高度。 避免在元件硬寫 #RRGGBB、px。
色彩策略:動態色 vs. 品牌色 M3 核心亮點:動態色可依使用者來源色(壁紙/內容)生成可存取的調色盤;也支援 靜態/品牌色。選錯會影響辨識度與可達性。 先選策略再實作 roles 避免把品牌主色硬壓在動態色上導致衝突
文字排印(Typography) M3 一套 type scale,含 15 組 baseline + 15 組 emphasized 用 tokens;照建議行高/粗細。 避免大小不成體系、行高擠壓。
版面與自適應 斷點 breakpoints 用 LayoutBuilder 管控間距與最大寬 避免固定單欄拉滿大螢幕。不要忽略旋轉與摺疊狀態。
動態與過場 2025 起,M3 以彈簧(spring)物理為核心;Expressive 引入 Standard / Expressive 兩種 motion scheme,統一感受與速度。 用新 physics tokens 強化層級/空間感。 避免沿用 M2 參數不調整、動畫冗長。

3. 送審相關事項

審核主題 相關審核內容 注意要點
廣告體驗 廣告是否可清楚關閉、不模仿系統或 App UI、不干擾操作 ① 全螢幕插頁必有明顯關閉;② 不得用假關閉鈕/遮擋系統元件;③ 不模擬通知或系統警示;④ 避免在關鍵操作中突然跳出。
仿冒與誤導 是否以 UI/名稱/圖示暗示官方或品牌關係;是否模仿系統功能 UI 誘導點擊。 ① 圖示/名稱/開發者名稱避免與他人混淆;② 如有合作關係需可證明;③ 不模仿系統 UI/警示。
最低可用品質與體驗 是否具備基本可用與清楚導覽;避免只包 WebView、重複內容 ① 關鍵流程(註冊/購買/返回)可順利完成;② 不是單純網站外殼;
評分/評論提示 在 App 內提示用戶進行評論時,應使用官方 In-App Review API;不得以獎勵換評分或用 UI 誘導特定評分。 ① 適時提示、不過量打擾;② 不提供優惠、金錢換評分;③ 不預填或引導 5星。

三、Material Design for Flutter

1. 簡介

Flutter 3.16 起預設 useMaterial3: true ( M3 )
flutter 開發實務上也會建議採用 Google Material Design 為主,
再視實務需要搭配 iOS Cupertino。

2. Flutter : Material 2 vs. Material 3

主題 Material 2 Material 3 Flutter 實作要點
色彩系統 ColorScheme.fromSwatch() ColorScheme.fromSeed() ThemeData ⭢ ColorScheme.fromSeed
字體系統 超大標題 headline1 / 內文標題 subtitle1 超大標題 displayLarge / 內文標題 titleMedium TextTheme.displayLarge、titleMedium 取代 M2 名稱
設計代幣(Design tokens) 未完整 token 化 M3 正式 token 化(包含顏色、字體、尺寸、動效…) 設計端、工具與程式共用 token 名稱。
按鈕家族 ElevatedButton / TextButton / OutlinedButton 新增 FilledButton作為主要強調動作,與 M3 色彩狀態系統一致 新專案以 FilledButton 為主行為按鈕,次要用 OutlinedButton / TextButton。
底部導覽 BottomNavigationBar NavigationBar 新案優先 NavigationBar
AppBar 以 elevation 投影為主 引入 surfaceTintColor(表面調色)與 scrolledUnderElevation(滾到內容下方時的外觀) 可在 AppBar 或 AppBarTheme 設定;M3 用色彩疊合而非單靠陰影。
互動狀態 API MaterialStateProperty(deprecated) WidgetStateProperty 新專案請用 WidgetStateProperty 系列
主題配置習慣 常見零散覆寫 primaryColor 等 集中在 ThemeData(colorScheme, textTheme, …) 官方 cookbook 提倡在 MaterialApp.theme 設定 app-wide 主題。

3. MaterialApp.theme 示範

ColorScheme.fromSeed 指定種子色,
Flutter 會依 Material 3 的色彩系統自動推導完整 ColorScheme,
因此換一個種子色就能「連動」整體主題配色。

GIF : 淺色模式 、 深色模式

//app_theme.dart

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';


class Brand {
 
  static const Color seed = Color(0xFF6750A4); //種子色 Value (Hex)

  //System Token 淺色模式
  static ColorScheme light({double contrast = 0}) =>
      ColorScheme.fromSeed(seedColor: seed, brightness: Brightness.light, contrastLevel: contrast);
  //System Token 深色模式
  static ColorScheme dark({double contrast = 0}) =>
      ColorScheme.fromSeed(seedColor: seed, brightness: Brightness.dark, contrastLevel: contrast);

  //設置主題
  static ThemeData theme(Brightness brightness, {double contrast = 0}) {
    final scheme = brightness == Brightness.dark
        ? dark(contrast: contrast)
        : light(contrast: contrast);

    return ThemeData(
      useMaterial3: true,    // M3
      colorScheme: scheme,   // 顏色方案
     
      textTheme: GoogleFonts.notoSansTextTheme(), //字體方案
    );
  }
}
//main.dart

import 'package:flutter/material.dart';
import 'app_theme.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    const appName = 'Custom Themes';

    return MaterialApp(
      title: appName,
      themeMode: ThemeMode.system, //隨裝置切換深、淺色模式
      theme: Brand.theme(Brightness.light), //淺色模式
      darkTheme: Brand.theme(Brightness.dark),//深色模式
      home: const MyHomePage(title: appName),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;
  const MyHomePage({super.key, required this.title});

  @override
  Widget build(BuildContext context) {
    final scheme = Theme.of(context).colorScheme; //App主題顏色方案
    final textTheme = Theme.of(context).textTheme;//App主題字體方案

    return Scaffold(
      appBar: AppBar(
        backgroundColor: scheme.secondary, 
        title: Text(
          title,
          style: textTheme.titleLarge!.copyWith(color: scheme.onSecondary),
        ),
      ),
      body: Center(
        child: Container(
          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
          color: scheme.primaryContainer, 
          child: Text(
            'Text with a background color',
            style: textTheme.bodyMedium!.copyWith(color: scheme.onPrimaryContainer),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: const Icon(Icons.add),
      ),
    );
  }
}

Day26 重點回顧

重點 內容
Human Interface Guidelines Apple 提供蘋果生態系開發的設計規範指引
Material Design Google 推出的跨平台設計系統
Material Design for Flutter Material Design 3 實作要點

上一篇
[ Day 25 ] Flutter UX & UI 實戰入門篇 — 生活在地球的勇者啊,怎麼見極樂世界呀?(1)
下一篇
[ Day 27 ] Flutter UI 深入應用篇 — 生活在地球的勇者啊,怎麼見極樂世界呀?(3)#動態歌詞
系列文
Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言