作者 / Kevin Jamaul Chisholm, Technical Program Manager for Dart and Flutter at Google
又到了 Flutter 穩(wěn)定版發(fā)布時(shí)間,我們無比自豪地宣布推出 Flutter 3 !僅 3 個(gè)月前,我們宣布了 Flutter 對 Windows 的支持。現(xiàn)在,我們再次懷著激動(dòng)的心情宣布,繼 Windows 之后,F(xiàn)lutter 現(xiàn)已穩(wěn)定支持 macOS 和 Linux!

我們總計(jì)合并了 5,248 條 PR,感謝各位 Flutter 貢獻(xiàn)者的辛勤工作!
此版本中激動(dòng)人心的升級包括: 更新了 Flutter 對 macOS 和 Linux 的支持,性能得到了顯著提升,針對移動(dòng)設(shè)備和 web 端的更新,以及諸多其他功能!此外,我們還帶來了關(guān)于減少對舊版 Windows 提供支持的消息,以及幾條重大變更。下面讓我們直奔主題吧!
全桌面平臺生產(chǎn)就緒
Linux 和 macOS 平臺的支持已進(jìn)入穩(wěn)定狀態(tài),內(nèi)含下列功能:
級聯(lián)菜單和 macOS 系統(tǒng)菜單欄支持
現(xiàn)在您可以使用 PlatformMenuBar widget 在 macOS 上創(chuàng)建平臺渲染的菜單欄,支持插入僅限該平臺使用的菜單,并控制 macOS 應(yīng)用菜單中的顯示內(nèi)容。

完整支持全桌面平臺多國文本輸入
全部三種桌面平臺完整支持多國文本輸入,包括使用文本 輸入法編輯器 (IME) 的語言,如中文、日文和韓文。同時(shí)支持第三方輸入法,如搜狗 (Sogou)、谷歌日文輸入法 (Google Japanese Input) 等。
全桌面平臺無障礙服務(wù)
Flutter 支持 Windows、macOS 和 Linux 平臺的無障礙服務(wù),包括屏幕文字閱讀、無障礙導(dǎo)航和顏色反轉(zhuǎn)等。
macOS 平臺默認(rèn)使用通用二進(jìn)制文件
在 Flutter 3 中,F(xiàn)lutter macOS 桌面應(yīng)用會被構(gòu)建為通用二進(jìn)制文件,從而原生支持使用 Intel 處理器的 Mac 電腦和搭載 Apple Silicon 的新設(shè)備。
不再支持使用 Windows 7/8 進(jìn)行開發(fā)
此版本將建議的 Windows 開發(fā)版本提升為 Windows 10。雖然我們不會禁止使用舊版本 (Windows 7、Windows 8、Windows 8.1) 進(jìn)行開發(fā),但由于 Microsoft 不再支持這些舊版本,我們僅會針對這些版本提供有限的測試。盡管我們會盡力為舊版本提供支持,但還是建議您升級版本。
注意: 在 Windows 7 和 8 上依然可以運(yùn)行 Flutter 應(yīng)用,此更改只影響我們推薦使用的開發(fā)環(huán)境。
移動(dòng)端更新
我們針對移動(dòng)端的更新包括:
支持可折疊設(shè)備
Flutter 3 支持可折疊移動(dòng)設(shè)備。通過由 Microsoft 牽頭的合作,讓大家可以使用新的功能和 widget 在可折疊設(shè)備上創(chuàng)建動(dòng)感、愉悅的體驗(yàn)。
作為合作的一部分,MediaQuery 現(xiàn)在包含一個(gè) DisplayFeature 列表,用以描述設(shè)備組件狀態(tài),包括鉸鏈、折疊狀態(tài)和屏幕劉海等。此外,DisplayFeatureSubScreen widget 包含的子 widget 的位置現(xiàn)在不會與 DisplayFeature 的邊界重疊,并且已經(jīng)用于框架的默認(rèn)對話框和彈出窗口,使 Flutter 默認(rèn)即可動(dòng)態(tài)適應(yīng)這些元素的位置。

非常感謝 Microsoft 團(tuán)隊(duì)。另外我們還要特別鳴謝 @andreidiaconu 所做出的貢獻(xiàn)!
歡迎大家嘗試 Surface Duo 模擬器示例,其中包含了 Flutter Gallery 的一個(gè)特別派生版本,以便了解 Flutter 在雙屏中的實(shí)際運(yùn)行情況:
支持 iOS 可變刷新率
Flutter 現(xiàn)已在使用 ProMotion 顯示屏的 iOS 設(shè)備上支持可變刷新率,包括 iPhone 13 Pro 和 iPad Pro。在這些設(shè)備上 Flutter 應(yīng)用的渲染刷新率可達(dá) 120 Hz,而之前最高為 60 Hz,這使得滾動(dòng)等快速動(dòng)畫的觀感體驗(yàn)更加流暢。請查看 官方文檔 了解詳情。
簡化 iOS 發(fā)布
我們?yōu)?flutter build ipa 命令添加了 新選項(xiàng),使得 iOS 應(yīng)用發(fā)布更加簡便。在您準(zhǔn)備好分發(fā)至 TestFlight 或 App Store 時(shí),請運(yùn)行 flutter build ipa 構(gòu)建 Xcode 歸檔 (.xcarchive 文件) 和應(yīng)用軟件包 (.ipa 文件)。您可選擇添加 --export-method ad-hoc、--export-method development 或 --export-method enterprise 選項(xiàng)。應(yīng)用軟件包構(gòu)建完成后,即可通過 Apple Transport macOS 應(yīng)用 將其上傳至 Apple,或使用 xcrun altool 在命令行中完成上傳 (運(yùn)行 man altool 獲取 App Store Connect API 密鑰驗(yàn)證說明)。上傳完成后,您的應(yīng)用即可發(fā)布至 TestFlight 或 App Store。在完成應(yīng)用顯示名稱、應(yīng)用圖標(biāo)等初始 Xcode 項(xiàng)目設(shè)置 后,您在發(fā)布應(yīng)用時(shí)就無需再打開 Xcode 了。
Gradle 版本更新
使用 Flutter 工具創(chuàng)建新項(xiàng)目時(shí),您或許已經(jīng)注意到,生成的文件現(xiàn)在使用了最新版本的 Gradle 和 Android Gradle 插件。對于現(xiàn)有的項(xiàng)目而言,您需要手動(dòng)將 Gradle 版本升級至 7.4,Android Gradle 插件版本升級至 7.1.2。
停止更新 32 位 iOS/iOS 9/iOS 10
按照 2022 年 2 月 2.10 穩(wěn)定版發(fā)布的公告,F(xiàn)lutter 對 32 位 iOS 設(shè)備以及 iOS 9 和 10 的支持即將結(jié)束。這一變化會影響到 iPhone 4S、iPhone 5、iPhone 5C 以及 iPad 第二、三、四代設(shè)備。Flutter 3 是最后一個(gè)支持上述 iOS 版本和設(shè)備的穩(wěn)定版本。
如需詳細(xì)了解此項(xiàng)變更,請參閱 RFC: 終止對 32 位 iOS 設(shè)備的支持。
Web 端更新
我們針對 web 端的更新包括:
圖像解碼
在瀏覽器支持的情況下,F(xiàn)lutter web 現(xiàn)在可以自動(dòng)檢測并使用 ImageDecoder API。到目前為止,大多數(shù)基于 Chrome 的瀏覽器都添加了此 API,如 Chrome、Edge、Opera、Samsung Browser 等。
這個(gè)新 API 使用瀏覽器內(nèi)置的圖像編解碼器在主線程之外異步解碼圖像。這使得圖像解碼速度提高 2 倍,而且完全不會阻塞主線程,消除了所有之前由圖像引起的卡頓現(xiàn)象。
Web 應(yīng)用的生命周期
Flutter web 應(yīng)用的新生命周期 API 提升了靈活性,可實(shí)現(xiàn)從托管 HTML 頁面控制 Flutter 應(yīng)用的引導(dǎo)程序,并支持使用 Lighthouse 分析您的應(yīng)用的性能表現(xiàn)。這適用于許多用例,包括以下常被開發(fā)者們提及的場景:
啟動(dòng)畫面。
加載指示器。
在 Flutter 應(yīng)用之前顯示的純 HTML 交互式加載頁。
請閱讀官方文檔 "自定義 web 應(yīng)用初始化" 了解詳細(xì)信息。
工具更新
我們針對 Flutter 和 Dart 工裝的更新內(nèi)容包括:
Lint package 更新
Lint package 2.0 版現(xiàn)已發(fā)布:
使用 flutter create 生成的 Flutter 3 應(yīng)用將自動(dòng)啟用 2.0 版 Lint 套件。我們建議大家運(yùn)行 flutter pub upgrade --major-versions flutter_lints,將現(xiàn)有應(yīng)用、package 和插件遷移到 2.0 版,以遵循 Flutter 最新、最優(yōu)的最佳實(shí)踐。
Lint 2.0 版中新增的大多數(shù)警告都帶有自動(dòng)修復(fù)功能。因此,當(dāng)您在應(yīng)用的 pubspec.yaml 中升級至最新 package 版本后,即可在代碼庫中運(yùn)行 dart fix --apply 自動(dòng)修復(fù)大多數(shù) Lint 警告 (某些警告仍需部分手動(dòng)操作)。對于尚未使用 package:flutter_lints 的應(yīng)用、package 或插件,建議開發(fā)者按照 遷移指南 遷移至最新版本。
性能提升
感謝開源貢獻(xiàn)者 knopp,局部重繪已經(jīng)在支持此功能的 Android 設(shè)備上實(shí)現(xiàn)。在我們的本地測試中,此功能在 Pixel 4XL 設(shè)備上將依照 backdrop_filter_perf 基準(zhǔn)測試的幀柵格化時(shí)間的平均值、90 百分位值和 99 百分位值縮減了 5 倍?,F(xiàn)在,iOS 設(shè)備和較新版本的 Android 設(shè)備上都已實(shí)現(xiàn)在單一矩形臟區(qū)出現(xiàn)時(shí)進(jìn)行局部重繪。
我們 進(jìn)一步提升 了簡單用例中不透明度動(dòng)畫的性能。具體而言,當(dāng) Opacity widget 只包含單個(gè)渲染原語時(shí),通常由 Opacity widget 調(diào)用的 saveLayer 方法可以省略。在為此優(yōu)化構(gòu)建的基準(zhǔn)測試中,此用例下的柵格化時(shí)間提升了 一個(gè)數(shù)量級。在今后的版本中,我們計(jì)劃為更多場景應(yīng)用此優(yōu)化。
在開源貢獻(xiàn)者 JsouLiang 的努力下,引擎的光柵和界面線程在 Android 和 iOS 上的運(yùn)行優(yōu)先級已經(jīng)高于其他線程 (比如 Dart VM 的后臺垃圾回收線程)。在我們的基準(zhǔn)測試中,這使得幀構(gòu)建平均時(shí)間提速 約 20%。
在第 3 版發(fā)布之前,光柵緩存的準(zhǔn)入策略只查看圖片中繪制算子的數(shù)量 (假設(shè)任何具有多個(gè)算子的圖片都應(yīng)該進(jìn)入緩存)。但這會導(dǎo)致引擎消耗內(nèi)存來緩存渲染速度極快的圖片。此版本 引入新的機(jī)制,根據(jù)所包含繪制算子的成本來估計(jì)圖像渲染的復(fù)雜性。在我們的性能測試中,使用新機(jī)制作為柵格緩存準(zhǔn)入策略可以 減少內(nèi)存用量,而不會降低性能。
感謝開源貢獻(xiàn)者 ColdPaleLight,他修復(fù)了 iOS 上由于 幀調(diào)度 bug 而導(dǎo)致少量動(dòng)畫幀丟失的問題。感謝所有報(bào)告此問題并提供掉幀復(fù)現(xiàn)視頻的每一個(gè)人。
Impeller
我們一直致力于解決 iOS 和其他平臺上的早期卡頓問題。在 Flutter 3 中,您可以在 iOS 上預(yù)覽一個(gè)名為 Impeller 的實(shí)驗(yàn)性渲染后端。Impeller 會在引擎構(gòu)建時(shí)預(yù)編譯一組 較為小巧、簡單的著色器,從而避免在應(yīng)用運(yùn)行時(shí)編譯,而后者是造成 Flutter 卡頓的主要原因。Impeller 尚未作好投產(chǎn)準(zhǔn)備,距離完成也還有一段距離。目前 Impeller 尚未實(shí)現(xiàn) Flutter 的所有功能特性,但我們對它在 flutter/gallery 應(yīng)用中實(shí)現(xiàn)的保真度和性能感到滿意,并且很高興地在這里和大家分享開發(fā)進(jìn)度。特別是,在 Gallery 應(yīng)用的過場動(dòng)畫中,即便最差的幀速度也比之前快大約 20 倍。
Impeller 可以帶標(biāo)記在 iOS 上使用。如果您要試用 Impeller,可以傳遞 --enable-impeller 標(biāo)記至 flutter run,或?qū)?Info.plist 文件中的 FLTEnableImpeller 標(biāo)記為 true。Impeller 的開發(fā)會繼續(xù)在 Flutter 主渠道進(jìn)行,我們希望在未來的版本中提供進(jìn)一步更新。
Android 上的內(nèi)聯(lián)廣 告
使用 google_mobile_ads package 時(shí),您應(yīng)該可以感受到用戶關(guān)鍵交互 (如頁面之間的滾動(dòng)和切換) 的性能有所提升。在新興市場廣為流行的設(shè)備上,這種性能提升尤其明顯。最棒的是,您無需更改任何代碼!
在具體實(shí)現(xiàn)方面,F(xiàn)lutter 現(xiàn)在是異步組合 Android 視圖 (即通常所說的 平臺視圖)。這意味著 Flutter 的光柵線程無需等待 Android 視圖渲染。現(xiàn)在,F(xiàn)lutter 引擎使用它管理的 OpenGL 紋理將視圖顯示在屏幕上。
更多令人興奮的更新
我們針對 Flutter 生態(tài)系統(tǒng)的其他更新包括:
Material 3
Flutter 3 支持新一代 Material Design,即 Material Design 3。Flutter 3 提供 Material 3 的可選支持,包括動(dòng)態(tài)顏色、最新顏色系統(tǒng)和字體等 Material You 功能,還包含許多組件的更新,以及在 Android 12 中引入的新觸摸波紋設(shè)計(jì)和拉伸滾動(dòng)等全新視覺效果。我們歡迎大家通過全新的 "將枯燥無味的 Flutter 應(yīng)用變得生動(dòng)有趣" 的 Codelab 來嘗試 Material 3 的功能特性。請參閱 API 文檔,詳細(xì)了解如何選用上述新功能特性,以及哪些組件支持 Material 3。另請關(guān)注 Material 3 Umbrella issue 了解最新開發(fā)進(jìn)展。
主題擴(kuò)展
借助 "主題擴(kuò)展 (Theme extension)",F(xiàn)lutter 現(xiàn)支持向 Material 庫中的 ThemeData 添加任何內(nèi)容。您現(xiàn)在可以指定 ThemeData.extensions,而無需 (在 Dart 中) 擴(kuò)展 ThemeData 并重新實(shí)現(xiàn)其 copyWith、lerp 和其他方法。另外,package 開發(fā)者也可以提供 ThemeExtension。請參閱 官方文檔 了解詳情,并查看 GitHub 上的 相關(guān)示例。
廣告
我們知道對于發(fā)布商來說,征求用戶同意對個(gè)性化廣告,以及應(yīng)對 Apple 的 "應(yīng)用追蹤透明度 (App Tracking Transparency, ATT)" 要求非常重要。
為了支持這些需求,Google 提供了 "用戶消息平臺 (User Messaging Platform, UMP)" SDK,取代了之前的開源 Consent SDK。在即將發(fā)布的 Google 移動(dòng)廣告 SDK (Flutter) 中,我們會增加對 UMP (用戶消息平臺) SDK 的支持,讓發(fā)布商能夠征求用戶同意。如需了解詳情,請?jiān)?pub.dev 上查看 google_mobile_ads package 頁面。
重大變更
在持續(xù)擴(kuò)展和改進(jìn) Flutter 的過程中,我們會盡量把重大變更的數(shù)量維持在最低限度。Flutter 3 包含以下重大變更:
- 2.10 版之后移除已棄用的 API
- 頁面切換轉(zhuǎn)為使用 ZoomPageTransitionsBuilder
- Chips 的 useDeleteButtonTooltip 遷移至 deleteButtonTooltipMessage
如果您正在使用上述 API,請參閱 Flutter.dev 上的 遷移指南。
總結(jié)
按照 Statista 和 SlashData 等分析機(jī)構(gòu)的統(tǒng)計(jì),F(xiàn)lutter 依然是最受歡迎的跨平臺界面工具包,我們能保持這種地位,社區(qū)的貢獻(xiàn)功不可沒,對此,Google Flutter 團(tuán)隊(duì)向大家致以由衷敬意。期待與各位社區(qū)成員共同努力,繼續(xù)提供由社區(qū)驅(qū)動(dòng)的工具,幫助大家為用戶創(chuàng)造出更多令人愉悅的體驗(yàn)!