又到了Flutter穩(wěn)定版發(fā)布時(shí)間,我們無(wú)比自豪地宣布推出Flutter 3!僅 3 個(gè)月前,我們宣布了Flutter 對(duì) Windows 的支持?,F(xiàn)在,我們?cè)俅螒阎?dòng)的心情宣布,繼 Windows 之后,F(xiàn)lutter 現(xiàn)已穩(wěn)定支持 macOS 和 Linux!
我們總計(jì)合并了 5,248 條 PR,感謝各位 Flutter 貢獻(xiàn)者的辛勤工作!
此版本中激動(dòng)人心的升級(jí)包括: 更新了 Flutter 對(duì) macOS 和 Linux 的支持,性能得到了顯著提升,針對(duì)移動(dòng)設(shè)備和 web 端的更新,以及諸多其他功能!此外,我們還帶來(lái)了關(guān)于減少對(duì)舊版 Windows 提供支持的消息,以及幾條重大變更。下面讓我們直奔主題吧!
全桌面平臺(tái)生產(chǎn)就緒
Linux 和 macOS 平臺(tái)的支持已進(jìn)入穩(wěn)定狀態(tài),內(nèi)含下列功能:
級(jí)聯(lián)菜單和 macOS 系統(tǒng)菜單欄支持
現(xiàn)在您可以使用 PlatformMenuBar widget 在 macOS 上創(chuàng)建平臺(tái)渲染的菜單欄,支持插入僅限該平臺(tái)使用的菜單,并控制 macOS 應(yīng)用菜單中的顯示內(nèi)容。
△ 級(jí)聯(lián)菜單示意
完整支持全桌面平臺(tái)多國(guó)文本輸入
全部三種桌面平臺(tái)完整支持多國(guó)文本輸入,包括使用文本
輸入法編輯器
(IME) 的語(yǔ)言,如中文、日文和韓文。同時(shí)支持第三方輸入法,如搜狗 (Sogou)、谷歌日文輸入法 (Google Japanese Input) 等。
- 輸入法編輯器https://en.wikipedia.org/wiki/Input_method
全桌面平臺(tái)無(wú)障礙服務(wù)
Flutter 支持 Windows、macOS 和 Linux 平臺(tái)的無(wú)障礙服務(wù),包括屏幕文字閱讀、無(wú)障礙導(dǎo)航和顏色反轉(zhuǎn)等。
macOS 平臺(tái)默認(rèn)使用通用二進(jìn)制文件
在 Flutter 3 中,F(xiàn)lutter macOS 桌面應(yīng)用會(huì)被構(gòu)建為通用二進(jìn)制文件,從而原生支持使用 Intel 處理器的 Mac 電腦和搭載 Apple Silicon 的新設(shè)備。
不再支持使用 Windows 7/8 進(jìn)行開發(fā)
此版本將建議的 Windows 開發(fā)版本提升為 Windows 10。雖然我們不會(huì)禁止使用舊版本 (Windows 7、Windows 8、Windows 8.1) 進(jìn)行開發(fā),但由于
Microsoft 不再支持這些舊版本
,我們僅會(huì)針對(duì)這些版本提供有限的測(cè)試。盡管我們會(huì)盡力為舊版本提供支持,但還是建議您升級(jí)版本。
- Windows 生命周期支持https://docs.microsoft.com/en-us/lifecycle/faq/windows
注意: 在 Windows 7 和 8 上依然可以運(yùn)行 Flutter 應(yīng)用,此更改只影響我們推薦使用的開發(fā)環(huán)境。
移動(dòng)端更新
我們針對(duì)移動(dòng)端的更新包括:
支持可折疊設(shè)備
Flutter 3 支持可折疊移動(dòng)設(shè)備。通過(guò)由 Microsoft 牽頭的合作,讓大家可以使用新的功能和 widget 在可折疊設(shè)備上創(chuàng)建動(dòng)感、愉悅的體驗(yàn)。
作為合作的一部分,
MediaQuery
現(xiàn)在包含一個(gè)
DisplayFeature
列表,用以描述設(shè)備組件狀態(tài),包括鉸鏈、折疊狀態(tài)和屏幕劉海等。此外,
DisplayFeatureSubScreen
widget 包含的子 widget 的位置現(xiàn)在不會(huì)與
DisplayFeature
的邊界重疊,并且已經(jīng)用于框架的默認(rèn)對(duì)話框和彈出窗口,使 Flutter 默認(rèn)即可動(dòng)態(tài)適應(yīng)這些元素的位置。
- MediaQueryhttps://api.flutter-io.cn/flutter/widgets/MediaQuery-class.html
- DisplayFeaturehttps://api.flutter-io.cn/flutter/dart-ui/DisplayFeature-class.html
- DisplayFeatureSubScreenhttps://api.flutter-io.cn/flutter/widgets/DisplayFeatureSubScreen-class.html
非常感謝 Microsoft 團(tuán)隊(duì)。另外我們還要特別鳴謝
@andreidiaconu
所做出的貢獻(xiàn)!
- @andreidiaconuhttps://github.com/andreidiaconu
歡迎大家嘗試
,其中包含了 Flutter Gallery 的一個(gè)特別派生版本,以便了解 Flutter 在雙屏中的實(shí)際運(yùn)行情況:
https://docs.microsoft.com/en-us/dual-screen/flutter/samples
支持 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)更加流暢。請(qǐng)查看
官方文檔
了解詳情:
https://docs.google.com/document/d/1O-ot6MydAl5pAr_XGnpR-Qq5A5CPDF6edaPu8xQtgCQ/edit?resourcekey=0-LlXeGtGRC67XL4NrGoc91A
簡(jiǎn)化 iOS 發(fā)布
我們?yōu)?/p>
flutter build ipa
命令添加了
新選項(xiàng)
,使得 iOS 應(yīng)用發(fā)布更加簡(jiǎn)便。在您準(zhǔn)備好分發(fā)至 TestFlight 或 App Store 時(shí),請(qǐng)運(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)建完成后,即可通過(guò)
Apple Transport macOS 應(yīng)用
將其上傳至 Apple,或使用
xcrun altool
在命令行中完成上傳 (運(yùn)行
man altool
獲取 App Store Connect API 密鑰驗(yàn)證說(shuō)明)。上傳完成后,您的應(yīng)用即可發(fā)布至
TestFlight 或 App Store
。在完成應(yīng)用顯示名稱、應(yīng)用圖標(biāo)等初始
Xcode 項(xiàng)目設(shè)置
后,您在發(fā)布應(yīng)用時(shí)就無(wú)需再打開 Xcode 了。
- 使用 flutter build spa 發(fā)布 IPA,無(wú)需使用 --export-options-plisthttps://github.com/flutter/flutter/pull/97672
- Apple Transport macOS 應(yīng)用https://apps.apple.com/us/app/transporter/id1450874784
- 在 App Store 發(fā)布您的應(yīng)用https://flutter.cn/docs/deployment/ios#release-your-app-to-the-app-store
- 檢查 Xcode 項(xiàng)目設(shè)置https://flutter-io.cn/docs/deployment/ios#review-xcode-project-settings
Gradle 版本更新
使用 Flutter 工具創(chuàng)建新項(xiàng)目時(shí),您或許已經(jīng)注意到,生成的文件現(xiàn)在使用了最新版本的 Gradle 和 Android Gradle 插件。對(duì)于現(xiàn)有的項(xiàng)目而言,您需要手動(dòng)將 Gradle 版本升級(jí)至 7.4,Android Gradle 插件版本升級(jí)至 7.1.2。
停止更新 32 位 iOS/iOS 9/iOS 10
按照 2022 年 2 月 2.10 穩(wěn)定版發(fā)布的公告,F(xiàn)lutter 對(duì) 32 位 iOS 設(shè)備以及 iOS 9 和 10 的支持即將結(jié)束。這一變化會(huì)影響到 iPhone 4S、iPhone 5、iPhone 5C 以及 iPad 第二、三、四代設(shè)備。Flutter 3 是最后一個(gè)支持上述 iOS 版本和設(shè)備的穩(wěn)定版本。
如需詳細(xì)了解此項(xiàng)變更,請(qǐng)參閱 RFC:終止對(duì) 32 位 iOS 設(shè)備的支持:
https://docs.google.com/document/d/1cc5EOsuTlbf4dTDTwmkD3aKjS8XEbVCIqi9BFct9XHM/edit?resourcekey=0-Iv0gXDx7nSDCe3YDfxDKqw
Web 端更新
我們針對(duì) web 端的更新包括:
圖像解碼
在瀏覽器支持的情況下,F(xiàn)lutter web 現(xiàn)在可以自動(dòng)檢測(cè)并使用 ImageDecoder API。到目前為止,大多數(shù)基于 Chrome 的瀏覽器都添加了此 API,如 Chrome、Edge、Opera、Samsung Browser 等。
這個(gè)新 API 使用瀏覽器內(nèi)置的圖像編解碼器在主線程之外異步解碼圖像。這使得圖像解碼速度提高 2 倍,而且完全不會(huì)阻塞主線程,消除了所有之前由圖像引起的卡頓現(xiàn)象。
Web 應(yīng)用的生命周期
Flutter web 應(yīng)用的新生命周期 API 提升了靈活性,可實(shí)現(xiàn)從托管 HTML 頁(yè)面控制 Flutter 應(yīng)用的引導(dǎo)程序,并支持使用 Lighthouse 分析您的應(yīng)用的性能表現(xiàn)。這適用于許多用例,包括以下常被開發(fā)者們提及的場(chǎng)景:
啟動(dòng)畫面。
- 加載指示器。
- 在 Flutter 應(yīng)用之前顯示的純 HTML 交互式加載頁(yè)。
請(qǐng)閱讀官方文檔 "
自定義 web 應(yīng)用初始化
" 了解詳細(xì)信息:
https://flutter-io.cn/docs/development/platform-integration/web/initialization
工具更新
我們針對(duì) Flutter 和 Dart 工裝的更新內(nèi)容包括:
Lint package 更新
Lint package 2.0 版現(xiàn)已發(fā)布:
- Flutterhttps://pub.flutter-io.cn/packages/flutter_lints/versions/2.0.0
- Darthttps://pub.flutter-io.cn/packages/lints/versions/2.0.0
使用
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
中升級(jí)至最新 package 版本后,即可在代碼庫(kù)中運(yùn)行
dart fix --apply
自動(dòng)修復(fù)大多數(shù) Lint 警告 (某些警告仍需部分手動(dòng)操作)。對(duì)于尚未使用
package:flutter_lints
的應(yīng)用、package 或插件,建議開發(fā)者按照
遷移指南
遷移至最新版本:
https://flutter-io.cn/docs/release/breaking-changes/flutter-lints-package#migration-guide
性能提升
感謝開源貢獻(xiàn)者
knopp
,局部重繪已經(jīng)在支持此功能的
Android 設(shè)備上實(shí)現(xiàn)
。在我們的本地測(cè)試中,此功能在 Pixel 4XL 設(shè)備上將依照
backdrop_filter_perf
基準(zhǔn)測(cè)試的幀柵格化時(shí)間的平均值、90 百分位值和 99 百分位值縮減了 5 倍?,F(xiàn)在,iOS 設(shè)備和較新版本的 Android 設(shè)備上都已實(shí)現(xiàn)在單一矩形臟區(qū)出現(xiàn)時(shí)進(jìn)行局部重繪。
Knopp
https://github.com/knopp
為 Android/OpenGL 實(shí)現(xiàn)局部重繪
https://github.com/flutter/engine/pull/29591
我們
進(jìn)一步提升
了簡(jiǎn)單用例中不透明度動(dòng)畫的性能。具體而言,當(dāng)
Opacity
widget 只包含單個(gè)渲染原語(yǔ)時(shí),通常由
Opacity
widget 調(diào)用的
saveLayer
方法可以省略。在為此優(yōu)化構(gòu)建的基準(zhǔn)測(cè)試中,此用例下的柵格化時(shí)間提升了
一個(gè)數(shù)量級(jí)
。在今后的版本中,我們計(jì)劃為更多場(chǎng)景應(yīng)用此優(yōu)化。
對(duì) Opacity 的 saveLayer 進(jìn)行優(yōu)化
https://github.com/flutter/engine/pull/30957
查看基準(zhǔn)測(cè)試
https://flutter-flutter-perf.skia.org/e/?begin=1643063115&end=1644004520&keys=X32827d8819e8271e025f50e77bf2bec0&requestType=0&xbaroffset=27447
在開源貢獻(xiàn)者
JsouLiang
的努力下,引擎的光柵和界面線程在 Android 和 iOS 上的運(yùn)行優(yōu)先級(jí)已經(jīng)高于其他線程 (比如 Dart VM 的后臺(tái)垃圾回收線程)。在我們的基準(zhǔn)測(cè)試中,這使得幀構(gòu)建平均時(shí)間提速
約 20%
。
JsouLiang
https://github.com/JsouLiang
查看基準(zhǔn)測(cè)試
https://flutter-flutter-perf.skia.org/e/?begin=1644581114&end=1644647407&keys=X3999dc0a0c89054eaa9f66bcff27d882&num_commits=50&request_type=1&xbaroffset=27549
在第 3 版發(fā)布之前,光柵緩存的準(zhǔn)入策略只查看圖片中繪制算子的數(shù)量 (假設(shè)任何具有多個(gè)算子的圖片都應(yīng)該進(jìn)入緩存)。但這會(huì)導(dǎo)致引擎消耗內(nèi)存來(lái)緩存渲染速度極快的圖片。此版本
引入新的機(jī)制
,根據(jù)所包含繪制算子的成本來(lái)估計(jì)圖像渲染的復(fù)雜性。在我們的性能測(cè)試中,使用新機(jī)制作為柵格緩存準(zhǔn)入策略可以
減少內(nèi)存用量
,而不會(huì)降低性能。
為 Metal 和 OpenGL 增加復(fù)雜度評(píng)分類
https://github.com/flutter/engine/pull/31417
查看基準(zhǔn)測(cè)試
https://flutter-flutter-perf.skia.org/e/?begin=1644790212&end=1646044276&keys=X4c7dd4e4903a38523816c00b31d4d787&requestType=0&xbaroffset=27636
感謝開源貢獻(xiàn)者
ColdPaleLight
,他修復(fù)了 iOS 上由于
幀調(diào)度 bug
而導(dǎo)致少量動(dòng)畫幀丟失的問(wèn)題。感謝所有報(bào)告此問(wèn)題并提供掉幀復(fù)現(xiàn)視頻的每一個(gè)人。
ColdPaleLight
https://github.com/ColdPaleLight
確保第二次 vsync 回調(diào)在 vsync 回調(diào)之后調(diào)用
https://github.com/flutter/engine/pull/31513
Impeller
我們一直致力于解決 iOS 和其他平臺(tái)上的早期卡頓問(wèn)題。在 Flutter 3 中,您可以在 iOS 上預(yù)覽一個(gè)名為
Impeller
的實(shí)驗(yàn)性渲染后端。Impeller 會(huì)在引擎構(gòu)建時(shí)預(yù)編譯一組
較為小巧、簡(jiǎn)單的著色器
,從而避免在應(yīng)用運(yùn)行時(shí)編譯,而后者是造成 Flutter 卡頓的主要原因。Impeller 尚未作好投產(chǎn)準(zhǔn)備,距離完成也還有一段距離。目前 Impeller 尚未實(shí)現(xiàn) Flutter 的所有功能特性,但我們對(duì)它在
flutter/gallery
應(yīng)用中實(shí)現(xiàn)的保真度和性能感到滿意,并且很高興地在這里和大家分享開發(fā)進(jìn)度。特別是,在 Gallery 應(yīng)用的過(guò)場(chǎng)動(dòng)畫中,即便最差的幀速度也比之前快大約
20 倍
。
Impeller
https://github.com/flutter/engine/tree/main/impeller
考慮使用一套可在啟動(dòng)時(shí)編譯的簡(jiǎn)單著色器
https://github.com/flutter/flutter/issues/77412
Flutter Gallery 應(yīng)用
https://github.com/flutter/gallery
查看基準(zhǔn)測(cè)試
https://flutter-flutter-perf.skia.org/e/?begin=1650297849&end=1651261748&queries=sub_result%3Dworst_frame_rasterizer_time_millis%26test%3Dnew_gallery_impeller_ios__transition_perf%26test%3Dnew_gallery_ios__transition_perf&requestType=0
Impeller 可以帶標(biāo)記在 iOS 上使用。如果您要試用 Impeller,可以傳遞
--enable-impeller
標(biāo)記至
flutter run
,或?qū)?/p>
Info.plist
文件中的
FLTEnableImpeller
標(biāo)記為
true
。Impeller 的開發(fā)會(huì)繼續(xù)在 Flutter 主渠道進(jìn)行,我們希望在未來(lái)的版本中提供進(jìn)一步更新。
Android 上的內(nèi)聯(lián)廣告
使用
google_mobile_ads
package 時(shí),您應(yīng)該可以感受到用戶關(guān)鍵交互 (如頁(yè)面之間的滾動(dòng)和切換) 的性能有所提升。在新興市場(chǎng)廣為流行的設(shè)備上,這種性能提升尤其明顯。最棒的是,您無(wú)需更改任何代碼!
google_mobile_ads
https://pub.flutter-io.cn/packages/google_mobile_ads
在具體實(shí)現(xiàn)方面,F(xiàn)lutter 現(xiàn)在是異步組合 Android 視圖 (即通常所說(shuō)的
平臺(tái)視圖
)。這意味著 Flutter 的光柵線程無(wú)需等待 Android 視圖渲染?,F(xiàn)在,F(xiàn)lutter 引擎使用它管理的 OpenGL 紋理將視圖顯示在屏幕上。
在 Flutter 應(yīng)用中使用集成平臺(tái)視圖托管您的原生 Android 和 iOS 視圖
https://flutter-io.cn/docs/development/platform-integration/platform-views
更多令人興奮的更新
我們針對(duì) 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)等全新視覺(jué)效果。我們歡迎大家通過(guò)全新的 "
將枯燥無(wú)味的 Flutter 應(yīng)用變得生動(dòng)有趣
" 的 Codelab 來(lái)嘗試 Material 3 的功能特性。請(qǐng)參閱
API 文檔
,詳細(xì)了解如何選用上述新功能特性,以及哪些組件支持 Material 3。另請(qǐng)關(guān)注
Material 3 Umbrella issue
了解最新開發(fā)進(jìn)展。
- Material Design 3https://m3.material.io/
- 將枯燥無(wú)味的 Flutter 應(yīng)用變得生動(dòng)有趣https://codelabs.developers.google.com/codelabs/flutter-boring-to-beautiful
- API 文檔https://api.flutter-io.cn/flutter/material/ThemeData/useMaterial3.html
- Material 3 Umbrella issuehttps://github.com/flutter/flutter/issues/91605
主題擴(kuò)展
借助 "主題擴(kuò)展 (Theme extension)",F(xiàn)lutter 現(xiàn)支持向 Material 庫(kù)中的
ThemeData
添加任何內(nèi)容。您現(xiàn)在可以指定
ThemeData
.extensions,而無(wú)需 (在 Dart 中) 擴(kuò)展
ThemeData
并重新實(shí)現(xiàn)其
copyWith
、
lerp
和其他方法。另外,package 開發(fā)者也可以提供
ThemeExtension
。請(qǐng)參閱
官方文檔
了解詳情,并查看 GitHub 上的
相關(guān)示例
。
- 主題擴(kuò)展https://docs.google.com/document/d/1LbD4JqBgAfHex02oR3r2jyu9lTBBNBmyec2ovT59Kr8/edit
- 主題擴(kuò)展示例https://github.com/guidezpl/flutter/blob/master/examples/api/lib/material/theme/theme_extension.1.dart
廣告
我們知道對(duì)于發(fā)布商來(lái)說(shuō),征求用戶同意對(duì)個(gè)性化廣告,以及應(yīng)對(duì) Apple 的 "應(yīng)用追蹤透明度 (App Tracking Transparency, ATT)" 要求非常重要。
為了支持這些需求,Google 提供了 "用戶消息平臺(tái) (User Messaging Platform, UMP)" SDK,取代了之前的開源 Consent SDK。在即將發(fā)布的 Google 移動(dòng)廣告 SDK (Flutter) 中,我們會(huì)增加對(duì) UMP (用戶消息平臺(tái)) SDK 的支持,讓發(fā)布商能夠征求用戶同意。如需了解詳情,請(qǐng)?jiān)?pub.dev 上查看 google_mobile_ads package 頁(yè)面。
Consent SDK
https://github.com/googleads/googleads-consent-sdk-ios
google_mobile_ads
https://pub.flutter-io.cn/packages/google_mobile_ads
重大變更
在持續(xù)擴(kuò)展和改進(jìn) Flutter 的過(guò)程中,我們會(huì)盡量把重大變更的數(shù)量維持在最低限度。Flutter 3 包含以下重大變更:
2.10 版之后移除已棄用的 API:
- https://flutter-io.cn/docs/release/breaking-changes/2-10-deprecations
- 頁(yè)面切換轉(zhuǎn)為使用 ZoomPageTransitionsBuilder:https://flutter-io.cn/docs/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder
- Chips 的 useDeleteButtonTooltip 遷移至 deleteButtonTooltipMessage:
https://flutter-io.cn/docs/release/breaking-changes/chip-usedeletebuttontooltip-migration
如果您正在使用上述 API,請(qǐng)參閱 Flutter.dev 上的
遷移指南
:
https://flutter-io.cn/docs/release/breaking-changes
總結(jié)
按照 Statista 和 SlashData 等分析機(jī)構(gòu)的統(tǒng)計(jì),Flutter 依然是最受歡迎的跨平臺(tái)界面工具包,我們能保持這種地位,社區(qū)的貢獻(xiàn)功不可沒(méi),對(duì)此,Google Flutter 團(tuán)隊(duì)向大家致以由衷敬意。期待與各位社區(qū)成員共同努力,繼續(xù)提供由社區(qū)驅(qū)動(dòng)的工具,幫助大家為用戶創(chuàng)造出更多令人愉悅的體驗(yàn)!
來(lái)源:谷歌開發(fā)者
-
谷歌
+關(guān)注
關(guān)注
27文章
6099瀏覽量
104773
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論