
一套程式碼庫,覆蓋每個螢幕
Flutter 將同一套渲染引擎、widget 目錄及響應式模型帶到 iOS、Android、桌面平台,以至現代瀏覽器。維護單一程式碼儲存庫可減少邏輯分歧、令 QA 週期更緊湊,並加快交付速度。隨著 Web 版本達至穩定,團隊可以放心將 Dart 程式碼推上生產環境,毋須為 HTML/JS 重寫 UI 層。
把瀏覽器視為一等公民:共用領域邏輯,但按平台調整 UI 密度、字體排印及輸入模式(懸停、鍵盤快捷鍵、焦點框)。Flutter 可組合的 widget 與主題 API,讓這種平台感知變得簡單直接,毋須重複程式碼。
響應式設計深度剖析
先以流動裝置優先的思維出發,再逐步為平板及寬闊的桌面畫布增強體驗。細小的螢幕迫使你聚焦:優先處理核心用戶旅程、精簡裝飾性 widget,並採用在任何螢幕尺寸都適用的非同步載入狀態。放大到大螢幕時,只需補充輔助性 UI,毋須重構核心敘事。
- LayoutBuilder 會提供當前的最大寬度/高度,讓你渲染不同的 widget 樹,毋須估算斷點或讀取全域狀態。
- MediaQuery 會提供裝置指標(內距、像素密度、文字縮放),用以決定觸控目標、欄距與字體排印,令 UI 真正自適應。
- 結合兩者,決定何時切換導航模式(底部欄 → 側欄軌 → 側邊導航)、減少欄數,或將卡片網格摺疊成輪播。
把斷點封裝在輔助 widget 中,讓產品團隊對「compact」與「expanded」的定義達成共識。一致性令設計系統保持清晰,QA 亦只需按斷點驗證一次,而非逐個畫面驗證。
可重用的斷點輔助元件
在任何需要自適應版面的地方放入這個 widget。它依靠 LayoutBuilder 取得約束條件,並透過 MediaQuery 感知安全區域,讓邏輯保持集中。
import 'package:flutter/material.dart';
enum ScreenSize { compact, medium, expanded }
class ResponsiveViewport extends StatelessWidget {
final Widget compact;
final Widget medium;
final Widget expanded;
const ResponsiveViewport({
super.key,
required this.compact,
required this.medium,
required this.expanded,
});
ScreenSize _sizeFor(double width) {
if (width < 600) return ScreenSize.compact;
if (width < 1024) return ScreenSize.medium;
return ScreenSize.expanded;
}
@override
Widget build(BuildContext context) {
final padding = MediaQuery.of(context).padding;
return LayoutBuilder(
builder: (_, constraints) {
final size = _sizeFor(constraints.maxWidth);
final inset = EdgeInsets.fromLTRB(
16 + padding.left,
24 + padding.top,
16 + padding.right,
24 + padding.bottom,
);
switch (size) {
case ScreenSize.compact:
return Padding(padding: inset, child: compact);
case ScreenSize.medium:
return Padding(padding: inset, child: medium);
case ScreenSize.expanded:
return Padding(padding: inset, child: expanded);
}
},
);
}
}把這些列舉從你的設計系統套件匯出,讓功能小隊按斷點插入專屬 widget,毋須在整個程式碼庫重複尺寸規則。
WEB 優化實戰手冊
延遲載入
使用 Dart 的 deferred 匯入來延遲載入較重的套件(例如圖表、3D 檢視器、ML 模型)。將僅限管理員的功能置於延遲模組之後,套件分析通常顯示初始 JS 可減少 20-30%。
例如:import 'analytics.dart' deferred as analytics;,然後在使用前呼叫 await analytics.loadLibrary(),以保持關鍵渲染路徑清爽。
資源優化
- 以 WebP/AVIF 匯出主視覺插圖,並在
pubspec.yaml中列出多種像素密度,讓 Flutter 提供清晰影像而不增加網絡傳輸負擔。 - 使用
flutter_font_subsetter為自訂字型做子集化;只保留會顯示的字形範圍,可節省數百 KB。 - 圖示優先使用向量資源(透過
flutter_svg使用 SVG)——可無限縮放,壓縮率亦極佳。
CanvasKit 與 HTML Renderer
CanvasKit
- 最適合動畫密集的儀表板、自訂著色器及複雜向量圖形。
- 文字排版可預測,與流動應用程式完全一致。
- 代價:初始下載較大(約 2 MB WASM),3G 網絡下冷啟動稍長。
HTML Renderer
- 體積小、TTFB 更快,非常適合內容為先或以表單為主的產品。
- 善用原生 DOM 無障礙樹。
- 代價:部分自訂繪圖 API 會回退至點陣圖繪製呼叫。
落實選擇前,先用 flutter run -d chrome --web-renderer 為兩款渲染器做效能分析。有些團隊甚至為低頻寬的進階用戶提供渲染器切換選項。
瀏覽器專屬細節
簡潔 URL 路由
用 Flutter 的 Router API 取代以井號為基礎的 URL。使用 MaterialApp.router 配合 RouteInformationParser,讓 SPA 導航與瀏覽器歷史堆疊保持同步。在 Firebase 等託管平台上,加入重寫規則令所有路徑指向 /index.html,即可在沒有 # 的情況下保留深層連結。
PWA 就緒的 Manifest
更新 web/manifest.json,填入易讀的名稱、高解像度圖示,以及配合品牌系統的顏色。再配合 flutter build web --pwa-strategy=offline-first,讓生成的 service worker 預先快取外殼資源,啟用安裝提示及離線重新載入。
透過 Chrome DevTools > Lighthouse 驗證可安裝性。確認 manifest 圖示、主題顏色、起始 URL、HTTPS 及 service worker 範圍均顯示綠色勾號。
部署前最終檢查清單
- 為靜態資源啟用 HTTP 快取標頭(Firebase Hosting 可透過
firebase.json設定處理)。 - 以你選定的渲染器及 PWA 策略執行
flutter build web --release。 - 透過 Chrome DevTools 的 Coverage 分頁審視套件體積;反覆移除未用的程式碼及資源。
- 模擬節流網絡(Fast 3G),確認中階手提電腦上的 TTI 保持在 5 秒以內。
套件通過 QA 後,即可將 build/web 目錄透過 firebase deploy --only hosting 部署至 Firebase Hosting。一個指令即享全球 CDN 分發、自動 SSL 及原子回滾。


