返回網誌
精選2025年11月24日安安科技團隊閱讀時間 7 分鐘

精通 FLUTTER FOR WEB:打造響應式
高效能應用程式

Flutter for Web 已正式穩定、可投入生產,能夠以同一套面向流動裝置及桌面的 Dart 程式碼庫,驅動像素級精準的瀏覽器體驗。以下講解如何將它的響應能力與效能發揮到極致。

Flutter for Web 響應式 UI
// 簡報

一套程式碼庫,覆蓋每個螢幕

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 感知安全區域,讓邏輯保持集中。

responsive_viewport.dart
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 及原子回滾。

// 部署

準備好發佈你的 FLUTTER WEB 應用程式了嗎?

我們的團隊協助有雄心的企業規劃響應式架構、優化渲染管線,並安全部署至 Firebase Hosting。

諮詢專家
// 擴散訊號

分享此文章