難以置信,Flutter 又發布穩定版了!讓我們歡迎 Flutter 2.10 閃亮登場。距離我們上一個版本發布還不到兩個月,但在如此有限的時間內,我們解決了 1,843 個問題,并合并了來自世界各地 155 位貢獻者的 1,525 個 PR。感謝大家的出色工作,尤其是在 2021 年底的假期期間,仍有很多人在辛勤工作。
這個版本帶來了許多好消息,包括 Flutter 對 Windows 支持的重大更新、幾項性能方面的重大改進、在框架中新增對圖標和顏色的支持,以及一些開發工具的改進。此外,我們還會分享移除 dev 渠道工作的進展,開始停止對舊版 iOS 的支持,以及少量重大更新。讓我們一起來揭開 Flutter 2.10 的面紗吧!
Flutter 已可用于開發正式版 Windows 應用
首先,也是最重要的是,Flutter 2.10 版本提供了 Windows 支持的穩定版本。您不再需要切換標記來在 Flutter 穩定渠道上構建 Windows 應用,此功能現已默認可用!
當然,我們可不僅僅只是調了一個標記,此版本還包含對文本處理、鍵盤輸入和鍵盤快捷鍵的廣泛改進,以及對命令行參數、多語言文本輸入和無障礙功能的支持,這些都已直接與 Windows 集成。
如果您想要了解關于 Windows 支持穩定版本的更多信息,請參閱《[Flutter 正式推出 Windows 平臺支持] 》一文,其中描述了 Flutter 在 Windows 上的架構,以支持深度集成,您還可以了解目前有多少 Flutter package 和插件已經支持 Windows。文章里還介紹了我們的工具和應用合作伙伴在 Windows 上使用 Flutter 打造的精彩示例!
性能提升
Flutter 社區成員 knopp 為 Flutter 2.10 版本提供了對臟區管理 (dirty region management) 的初步支持。他為 iOS/Metal 上的單個臟區實現了部分重繪。這一變化將一些基準測試中第 90 和第 99 百分位數的光柵化時間縮短了一個數量級,并將這些基準測試中的 GPU 占用率從 90% 以上降低到了 10% 以下。
- Knopp https://github.com/knopp
- #28801: 在 iOS/Metal 上實現部分重繪 https://github.com/flutter/engine/pull/28801
我們希望在后續版本中,將部分重繪的優勢引入其他平臺:
https://github.com/flutter/engine/pull/29591
在 Flutter 2.8 中,我們推出了自己的內部圖像記錄格式。而在 Flutter 2.10 中,我們已經開始使用它來實現優化。例如,不透明層現在以更加高效的方式得以實現。即使在最糟糕的情況下,基準測試中每幀光柵化時間也下降到了先前值的三分之一以下。
- #53501: 考慮引入定制記錄格式 https://github.com/flutter/flutter/issues/53501
- #29775: 不透明窺視孔優化 https://github.com/flutter/engine/pull/29775
隨著我們繼續開發圖像記錄格式,我們希望這一優化可以擴展到更多場景。
在分析和發布模式下,Dart 代碼會提前編譯為原生機器代碼。這段代碼高效和輕量的關鍵是整個程序的類型流分析,它實現了多個編譯器優化和激進的搖樹操作 (tree-shaking)。但是,由于類型流分析必須覆蓋整個程序,開銷可能過高。因此,Flutter 2.10 版本增加了更快的類型流分析實現。在我們的基準測試中,Flutter 應用的總體構建時間下降了約 10%。
- 使用 RTA 改善 AOT 編譯速度 https://dart.googlesource.com/sdk.git/+/e698500693603374ecc409e158f36c25bff45b12
提升性能、減少內存用量和降低延遲,是 Flutter 團隊一如既往的首要任務。我們會在后續版本中帶來更多的改進。
iOS 平臺更新
除了性能方面的提升,我們還添加了一些平臺特定的功能和改進。其中一個改進來自 luckysmg: 在 iOS 上帶來了更順滑的鍵盤動畫。您無需做任何事情即可獲得這項改進。
- luckysmg https://github.com/luckysmg
- #29281: 在 iOS 上實現鍵盤動畫 https://github.com/flutter/engine/pull/29281
除此之外,我們還通過修復一些邊界情況的崩潰問題,提高了 iOS 攝像頭插件的穩定性:
https://github.com/flutter/plugins/pull/4608
https://github.com/flutter/plugins/pull/4661
https://github.com/flutter/plugins/pull/4619
最后,我們為 64 位的 iOS 架構帶來了能減少內存用量的新功能——壓縮指針:https://github.com/flutter/engine/pull/30077
64 位架構的指針表示為 4 字節的數據結構。當您有大量對象時,指針本身占用的空間會增加應用整體的內存用量,特別是當您的應用十分龐大復雜,會產生更多的 GC 抖動時。然而,您的 iOS 應用不太可能有足夠的對象來占用大部分的 32 位地址空間 (20 億個對象),更不用說龐大的 64 位地址空間 (9 千萬億個對象) 了。
壓縮指針最早出現在 Dart 2.15 中,而在 Flutter 2.10 中,我們使用它來減少 64 位 iOS 應用的內存使用。大家可以查看 [Dart 2.15 發布博文] 以了解詳情。
在閱讀 Dart 發布博文時,也別忘了查看 Dart 2.16 的發布公告,以了解適用于 Windows 的 package 平臺標簽,以及 pub.dev 上的新搜索體驗:https://medium.com/dartlang/dd87abd6bad1
Android 平臺更新
同樣的,Flutter 2.10 版本也包含針對 Android 平臺的大量改進。在默認情況下,當您創建新應用時,Flutter 默認支持最新的 Android 版本,即 Android 12 (API 級別 31)。此外,Flutter 2.10 版本自動啟用了 MultiDex 支持。如果您的應用支持 Android SDK 21 以下的版本,并且超過了 64K 方法上限,您只需將 --multidex 標記傳遞給 flutter build appbundle 或 flutter build apk 命令,您的應用即可支持 MultiDex。
- 為方法數超過 64K 的應用啟用 MultiDex
https://developer.android.google.cn/studio/build/multidex
最后,大家向我們反饋道,Gradle 給出的錯誤消息有時相當令人費解。于是我們調整了 Flutter 工具,它現在會為常見問題提供解決步驟。例如: 假設您給應用添加了一個插件,該插件需要您提高支持的最低 Android SDK 版本,您現在將在日志中看到如下 "Flutter Fix" 建議。
我們將繼續為常見錯誤消息添加更多解決方法建議,如果您認為有其他的錯誤消息也需要這樣提供解決步驟,也歡迎向我們提供反饋。
Web 平臺更新
Flutter 2.10 也包含一些對 web 平臺的改進。在先前的版本中,當滾動到多行 TextField 的邊緣時,會無法正確地滾動。Flutter 2.10 加入了文本選擇的邊緣滾動: 當選區移動出文本區域時,區域會進行滾動以跟上選擇的內容。這個更新目前已在 web 和桌面端應用中提供。
- #93170: 桌面端邊緣滾動
https://github.com/flutter/flutter/pull/93170
另外,Flutter 2.10 還包括對 web 平臺的另一項顯著改進。我們一直致力于減少將 Flutter 部署到 web 端的開銷。在先前的版本中,每當我們想要將原生 HTML widget 添加到 Flutter 應用中時,都會需要一個疊加層,以用作 web 平臺視圖。每個疊加層都支持自定義繪制,但同時也會產生一定的開銷。如果您的應用中含有大量原生 HTML widget,例如鏈接,那么就會產生大量的開銷。在 Flutter 2.10 中,我們為 web 創建了全新的 "非繪制平臺視圖",基本消除了這種開銷。我們已經將此優化應用到 Link widget 中,這意味著,如果您的 Flutter web 應用中有大量鏈接,它們將不再額外產生大量開銷。今后我們會將這一優化措施應用到其他 widget 中。
- #4578: 將 Link 標記為隱藏工廠組件
https://github.com/flutter/plugins/pull/4578
- Linkh ttps://pub.flutter-io.cn/documentation/url_launcher/latest/link/Link-class.html
Material 3
Flutter 2.10 開始支持 Material 3,我們添加了從單個種子顏色生成整個配色方案的功能:
https://github.com/flutter/flutter/pull/93463
借助此功能,您可以使用任意顏色來創建 ColorScheme 實例:
final lightScheme = ColorScheme.fromSeed(seedColor: Colors.green);
final darkScheme = ColorScheme.fromSeed(seedColor: Colors.green, brightness: Brightness.dark);
ThemeData 工廠構造函數還有一個新的 colorSchemeSeed 參數,允許您直接生成主題的配色方案:
final lightTheme = ThemeData(colorSchemeSeed: Colors.orange, …);
final darkTheme = ThemeData(colorSchemeSeed: Colors.orange, brightness: Brightness.dark, …);
此外,Flutter 2.10 還提供了 ThemeData.useMaterial3 標記,可以將組件切換到新的 Material 3 外觀。
最后,我們還添加了 1,028 個全新的 Material 圖標:
https://github.com/flutter/flutter/pull/95007
△ 1,028 個全新 Material 圖標 (圖中是一小部分)
大家可以在我們的 Material 3 工作跟蹤頁中找到相關的更新內容,歡迎大家和我們分享反饋:
https://github.com/flutter/flutter/issues/91605
集成測試改進
2020 年 12 月,我們發布了[使用 integration_test package 來進行端到端測試] 的新方法。這個新 package 取代了 flutter_driver package,成為了我們推薦的集成測試方式,它提供了新的功能,如支持 Firebase Test Lab,以及對 web 端和桌面端的支持。
之后,我們對集成測試做了進一步的改進,包括將 integration_test package 捆綁進 Flutter SDK,使其更容易與您的應用進行集成。如果您要將現有的 flutter_driver 測試轉移到 integration_test,請查閱我們新編寫的遷移指南:
https://flutter.cn/docs/testing/integration-tests/migration
△ 新的 flutter_driver 到 integration_test 遷移指南中的一個示例
一些現有的文檔、示例和 Codelab 也針對 integration_test 進行了更新。在開始使用之前,請用您的瀏覽器打開 flutter.dev 上的 "測試 Flutter 應用" 頁面。如果您還沒有在 Flutter 應用上使用 integration_test,現在是時候開始了!
- 集成測試 https://flutter.cn/docs/testing/integration-tests
- 性能分析 https://flutter.cn/docs/cookbook/testing/integration/profiling
- 代碼示例 https://github.com/flutter/samples/tree/master/testing_app
- Codelab https://codelabs.developers.google.com/codelabs/flutter-app-testing
- 測試 Flutter 應用 https://flutter.cn/docs/testing
Flutter DevTools
在 Flutter 2.10 版本中,我們也對 Flutter DevTools 做了一些改進,包括從命令行直接使用 DevTools 的便捷功能?,F在您無需使用 pub global activate 來下載和運行最新版本,而只需使用 dart devtools 命令,即可獲取與您正在使用的 Flutter 版本一致的最新版 DevTools。
我們還進行了一些易用性更新,包括改進了在調試變量窗格中檢查大型列表和映射的功能 (鳴謝 elliette)。
- #3526: 在性能頁的 Flutter 幀圖表中增加幀數https://github.com/flutter/devtools/pull/3526
- #3493: 為性能視圖的 Flutter 幀增加豐富工具提示https://github.com/flutter/devtools/pull/3493
- #3480: 為程序瀏覽器摘要視圖增加選擇對象功能https://github.com/flutter/devtools/pull/3480
- #3497: 改進檢查大型 Map 和 List 類型https://github.com/flutter/devtools/pull/3497
- elliettehttps://github.com/elliette
最后,我們即將發布年度 DevTools 調查問卷!請和我們分享使用反饋,以幫助我們改善您的開發體驗。
調查問卷入口將于下周發布在 DevTools 中。這里提前感謝大家參與本次調研!
VSCode 的改進
Flutter 的 Visual Studio Code 擴展程序也有許多功能得到了改進,包括可以在代碼的更多位置預覽顏色,以及可以為您更改代碼的顏色選擇器:
https://github.com/Dart-Code/Dart-Code/issues/3240
此外,如果您想參與 VSCode Dart 和 Flutter 擴展程序預發布版本的測試,可以在擴展程序設置中切換到預發布版本:
https://github.com/Dart-Code/Dart-Code/issues/3729
您可以在 flutter-announce 郵件列表中閱讀相關文章,以了解有關此次更新的詳細信息:
https://groups.google.com/g/flutter-announce
- VS Code 擴展程序 v3.32 https://groups.google.com/g/flutter-announce/c/lR-yn1s9HKk
- VS Code 擴展程序 v3.34 https://groups.google.com/g/flutter-announce/c/lDSpaiWvUdI
移除 dev 渠道
在 [Flutter 2.8] 中,我們宣布正在移除 dev 渠道,以便簡化您的選擇,并減少工程開銷。在 Flutter 2.10 版本中,我們已經完成了這項工作,包括:
https://github.com/flutter/flutter/issues/94962
- 更新 Flutter 工具以幫助開發者遷移出 dev 渠道
- 更新 wiki 以反映更新后的客戶承諾
- 更新棄用政策
- 從 DartPad、預提交測試和網站中移除對 dev 渠道的支持
Dev 渠道現已被徹底移除。如果我們有所遺漏,請告知我們:http://github.com/flutter/flutter/issues
對 iOS 9.3.6 的支持進入尾聲
由于使用量的減少,以及在實驗室中維護目標設備的難度增加,我們正在調整**對 iOS 9.3.6 的支持,從 "支持" 級改為 "盡力而為" 級**。這意味著我們對 iOS 9.3.6 的支持和對 32 位 iOS 設備的支持將僅通過編碼實踐、非常態工作和社區測試來維護。
-
將 32 位 iOS 平臺支持改為 "盡力而為" 級 http://flutter.cn/go/rfc-32-bit-ios-support
-
已支持的平臺
https://flutter.cn/docs/development/tools/sdk/release-notes/supported-platforms
我們預計在今年第三季度,在 Flutter 穩定版本中放棄對 32 位 iOS 設備以及 iOS 9 和 10 的支持。這意味著基于穩定 Flutter SDK 構建的應用將無法在 32 位 iOS 設備上運行,并且 Flutter 支持的最低 iOS 版本將提升至 iOS 11。
重大變更
我們還努力在每個版本中減少重大變更的數量,盡管在這個版本中我們依然沒有完全做到零重大變更,但我們會繼續努力!
-
需要的 Kotlin 版本
https://flutter.cn/docs/release/breaking-changes/kotlin-version
-
v2.5 之后棄用的 API
https://flutter.cn/docs/release/breaking-changes/2-5-deprecations
-
Web 上的原始圖像使用正確的來源和顏色
https://flutter.cn/docs/release/breaking-changes/raw-images-on-web-uses-correct-origin-and-colors
-
支持隨手寫 (Scribble) 文本輸入: Text Input Client
https://flutter.cn/docs/release/breaking-changes/scribble-text-input-client
如果您仍在使用上述 API,可以前往 flutter.dev 上閱讀遷移指南。像往常一樣,我們非常感謝社區提供測試,幫助我們識別這些重大變更。
- 遷移指南
https://flutter.cn/docs/release/breaking-changes
- Flutter 用戶測試
https://github.com/flutter/tests/blob/master/README.md
總結
這里謹代表 Google Flutter 團隊的所有人說一聲——謝謝!感謝您加入到社區中來,助力 Flutter 成為最受歡迎的跨平臺 UI 工具包 (正如 Statista 和 SlashData 等分析機構所指出的那樣)。Windows 平臺支持穩定版本的到來只是這一年更多驚喜的起點,非常期待能和大家一起繼續構建更多的精彩!