跳至主要內容
YIM NEWS
† 最新報導
科技 分析

Material 不再住在 SDK 裡:Flutter 3.50 這次改版,是在還技術債

刊登 2026/11/15 04:50 閱讀約 5 分鐘 全站第 1,663 篇

11 月 11 日,Flutter 3.50 與 Dart 3.14 正式發布。中國開發者社羣裡以長期追蹤 Flutter 更新聞名的「戀貓de小郭」在掘金發布的整理文,把這個版本形容為「把歷史包袱扔掉」。這個說法不誇張:這次改版動的不是表面功能,而是框架本身的結構。

最大的改變:樣式庫搬出 SDK

過去想在 Flutter 裡用 Google 的 Material 設計語言,或是 iOS 風格的 Cupertino 元件,只要 import package:flutter/material.dart 或 package:flutter/cupertino.dart,因為它們就住在 SDK 裡。

從 3.50 開始,這兩個庫正式廢棄,拆分為 pub.dev 上的獨立套件 material_ui 與 cupertino_ui。新建專案預設改用新套件,舊專案則跑一行指令 dart fix --apply --code=migrate_design_widgets 就能自動遷移:它會在 pubspec.yaml 加上新的依賴、把所有舊的 import 路徑重寫,連本地化(Localizations)相關的程式碼與設定一併同步。

用生活比喻,這就像大樓原本把傢俱直接蓋進建築結構裡,現在把傢俱搬出去變成獨立商品。房子(引擎)變輕,傢俱(樣式庫)可以各自獨立改版,不必等整棟大樓翻修。

滾動視圖的陳年痛點有解了

另一個值得注意的重點在滾動視圖。寫過複雜列表 UI 的開發者幾乎都遇過這種情況:在 CustomScrollView 裡放一個帶圓角背景的區塊,上面又有半透明的吸頂 Header,內容往上滾進 Header 底下時,圓角不是被切平,就是重疊區顯示錯亂。原因是傳統的 ClipRRect 是 RenderBox,套不住 Sliver 這種 RenderSliver 結構。

3.50 在 rendering/sliver_clip.dart 引入了 SliverClipRect 與 SliverClipRRect,並內建 ClipOverlapBehavior 列舉,提供三種面對吸頂 Header 重疊時的行為:none 讓半透明毛玻璃 Header 下的內容透出來;followEdge 是預設值,沿重疊邊緣截斷;preserveShape 則讓圓角貼著 Header 下緣平滑收縮,不會被硬生生切平。

對日常開發的意義很直接:過去要靠 hack 或犧牲視覺細節繞過的問題,現在變成宣告式的參數。

效能與安全:一幀的差距,一個高風險漏洞

iOS 端這次做了大量效能優化,其中觸控響應的改善最能被使用者感知:來源整理指出,60Hz 螢幕快了約 16ms,120Hz 快了 8ms,等於直接快一整幀。別小看這個數字,觸控延遲是使用者「手感」的主要來源,一幀的差距在滑動頻繁的介面上是摸得到的。

Android 端則補了一個高風險漏洞:release 版本過去允許透過外部 Intent 注入啟動參數,這個入口現在被擋住了。對一般使用者的提醒是老生常談但依然有效:把手上的 App 更新到用新版本 SDK 建置的版本,這類修補才會生效。

另外,Hybrid Composition 的再進化(HCPP)改善了 Flutter 內容與原生視圖混合時的層級成本,而全新的 dart migrate 指令、FFIgen 與 JNIgen 的原生直連也進入穩定版,代表 Dart 與平臺原生程式碼之間的界線正在變薄。

這對開發者意味著什麼

回頭看,Dart 語言本身的演進軌跡也在往同一個方向走。先前我們介紹過Dart 3.15 補上 this 的類型提升,語言層在清掉多年繞路寫法;這次 3.50 則是在框架層做同樣的事,把樣式庫、滾動裁剪、遷移工具一一整理。

對正在評估跨平臺方案的團隊,這次改版傳遞的訊號有兩層。短期是遷移成本:既有專案需要跑一次自動遷移,並驗證相依套件是否跟進新套件結構。長期是維護節奏:樣式庫獨立出去之後,介面元件的更新可以脫離引擎版本自行推進,這對像用 Flutter 做起的卦象 App這類個人側計畫尤其有感,升級引擎不再連帶動搖整套 UI 依賴。

一個框架成熟與否,往往看它敢不敢動自己的地基。Flutter 3.50 動了,而且給了開發者自動化的搬遷工具,這比新增幾個炫技功能更值得記下來。

資料來源

  1. 01 參考來源 juejin.cn

本文使用 AI 協助整理或撰稿,引用與分析仍應依原始資料核對。

編輯政策 更正與勘誤