2023 年新春之際, Flutter 喜提了 3.7 的大版本更新亭饵,在 Flutter 3.7 中主要有改進(jìn)框架的性能休偶,增加一些很棒的新功能,例如:創(chuàng)建自定義菜單欄辜羊、級(jí)聯(lián)菜單踏兜、更好地支持國(guó)際化的工具、新的調(diào)試工具等等八秃。
另外 Flutter 3.7 還改進(jìn)了 Global selection碱妆、使用 Impeller提升渲染能力、DevTools 等功能喜德,以及一如既往的性能優(yōu)化。
PS :3.7 版本包含大量垮媒,大量舍悯,大量更新內(nèi)容航棱,感覺(jué)離 4.0 不遠(yuǎn)了。
提升 Material 3 支持
隨著以下 Widget 的遷移萌衬,Material 3 支持在 3.7 中得到了極大提升:
Badge
BottomAppBar
-
Filled
和Filled Tonal
按鍵 SegmentedButton
Checkbox
Divider
Menus
DropdownMenu
-
Drawer
和NavigationDrawer
ProgressIndicator
-
Radio
按鍵 Slider
SnackBar
TabBar
-
TextFields
和InputDecorator
Banner
要使用這些新功能只需打開(kāi) ThemeData
的 useMaterial3
標(biāo)志即可饮醇。
要充分利用 M3 的特性支持,還需要完整的 M3 配色方案秕豫,可以使用新的 theme builder 工具朴艰,或者使用構(gòu)造函數(shù)的 colorSchemeSeed
參數(shù)生成一個(gè)ThemeData
:
MaterialApp (
theme : ThemeData (
useMaterial3 : true,
colorSchemeSeed : Colors.green,
),
// …
);
使用這些組件,可以查看展示所有新 M3 功能的 interactive demo
菜單欄和級(jí)聯(lián)菜單
Flutter 現(xiàn)在可以創(chuàng)建菜單欄和級(jí)聯(lián) context 菜單混移。
對(duì)于 macOS 可以使用 PlatformMenuBar
創(chuàng)建一個(gè)菜單欄祠墅,它定義了由 macOS 而不是 Flutter 渲染的原生菜單欄支持。
而且歌径,對(duì)于所有平臺(tái)可以定義一個(gè) Material Design menu 毁嗦,它提供級(jí)聯(lián)菜單欄 ( MenuBar
) 或由用戶(hù)界面觸發(fā)的獨(dú)立級(jí)聯(lián)菜單( MenuAnchor
) 。
這些菜單可完全自主定制回铛,菜單項(xiàng)可以是自定義 Widget狗准,或者是使用新的菜單項(xiàng) Widget ( MenuItemButton
, SubmenuButton
)。
Impeller 預(yù)覽
這里很高興地宣布新的 Impeller 渲染引擎 已經(jīng)可以在 Stable Channel 上的 iOS 進(jìn)行預(yù)覽茵肃。
Flutter 團(tuán)隊(duì)相信 Impeller 的性能將達(dá)到或超過(guò)大多數(shù)應(yīng)用的 Skia 渲染器腔长,并且在保真度方面,Impeller 實(shí)現(xiàn)幾乎覆蓋了少數(shù)極端下的使用場(chǎng)景验残。
未來(lái)在即將發(fā)布的穩(wěn)定版本中可能會(huì)讓 Impeller 成為 iOS 上的默認(rèn)渲染器捞附,如果有任何問(wèn)題,歡迎在 GitHub 的 Impeller Feedback 上提交反饋胚膊。
雖然目前期待的結(jié)果是 iOS 上的 Impeller 可以滿(mǎn)足幾乎所有現(xiàn)有 Flutter 應(yīng)用的渲染需求故俐,但 API 覆蓋率仍然存在一些差距:
在 Flutter wiki 上列出了少量剩余的未覆蓋情況,用戶(hù)可能還會(huì)注意到 Skia 和 Impeller 之間在渲染中的細(xì)微視覺(jué)上存在差異紊婉,而這些細(xì)微差別可能會(huì)導(dǎo)致錯(cuò)誤药版,所以如果有任何問(wèn)題,請(qǐng)不要猶豫喻犁,歡迎在 Github 提出問(wèn)題槽片。
社區(qū)的貢獻(xiàn)大大加快了 Impeller 上的進(jìn)展。特別是 GitHub 用戶(hù) ColdPaleLight肢础、guoguo338还栓、JsouLiang 和 magicianA 為該版本貢獻(xiàn)了 291 個(gè) Impeller 相關(guān)補(bǔ)丁中的 37 個(gè)(>12%)。
另外 Flutter 將繼續(xù)在 Impeller 的 Vulkan 上繼續(xù)推進(jìn)支持(在舊設(shè)備上回退到 OpenGL)传轰,但 Android 上的 Impeller 目前還未準(zhǔn)備好剩盒,Android 上的支持正在積極開(kāi)發(fā)中,希望可以在未來(lái)的版本中分享更多關(guān)于它的信息——以及未來(lái)更多關(guān)于 desktop 和 web 上的支持
在 GitHub 上的 Impeller 項(xiàng)目板上 可以關(guān)注進(jìn)展慨蛙。
iOS 版本驗(yàn)證
當(dāng)開(kāi)發(fā)者發(fā)布 iOS 應(yīng)用時(shí)辽聊, checklist of settings to update 可確保開(kāi)發(fā)者的應(yīng)用已準(zhǔn)備好提交到 App Store纪挎。
flutter build ipa
命令現(xiàn)在會(huì)驗(yàn)證其中一些設(shè)置,并在發(fā)布前通知開(kāi)發(fā)者是否需要對(duì)應(yīng)用進(jìn)行更改跟匆。
開(kāi)發(fā)工具更新
在 3.7 版本中异袄,有幾個(gè)關(guān)于新的工具和功能方面的改進(jìn)。
DevTools 內(nèi)存調(diào)試工具新增了三個(gè)功能選項(xiàng)卡玛臂,Profile烤蜕、**Trace **和 Diff,它們支持所有以前支持的內(nèi)存調(diào)試功能迹冤,并添加了更多功能以方便調(diào)試讽营。
新功能包括:
- 按 class 和 memory 類(lèi)型分析應(yīng)用的當(dāng)前內(nèi)存分配
- 調(diào)查哪些代碼路徑在運(yùn)行時(shí)為一組 class 分配內(nèi)存
- 差異內(nèi)存快照以了解兩個(gè)時(shí)間點(diǎn)之間的內(nèi)存管理
所有這些新的內(nèi)存功能都記錄在 docs.flutter.dev 上
Performance 頁(yè)面還有一些值得注意的新功能,性能頁(yè)面頂部的Frame Analysis 提供了對(duì)所選 Flutter frame 的分析:
可能包括有關(guān)跟蹤到的 frame 的 expensive 操作的建議叁巨,或有關(guān)在 Flutter 框架中檢測(cè)到的 expensive 操作的警告斑匪。
這些只是 3.7 里 DevTools 的幾個(gè)亮點(diǎn), 3.7 版本還包含幾個(gè)錯(cuò)誤修復(fù)和更多功能改進(jìn)锋勺,包括 Inspector蚀瘸、Network profiler 和 CPU profiler 的一些重要錯(cuò)誤修復(fù)。
如需更深入的更新列表庶橱,請(qǐng)查看 Flutter 3.7 中 DevTools 更改的發(fā)行說(shuō)明贮勃。
自定義 Context 菜單
3.7 開(kāi)始可以在 Flutter 應(yīng)用的任何位置創(chuàng)建自定義 Context 菜單,還可以使用它們來(lái)自定義內(nèi)置的 Context 菜單苏章。
例如寂嘉,開(kāi)發(fā)者可以將 “發(fā)送電子郵件” 按鈕添加到默認(rèn)文本選擇工具欄,當(dāng)用戶(hù)選擇電子郵件地址 (code) 時(shí)枫绅,該工具欄就會(huì)顯示泉孩。
通過(guò) contextMenuBuilder
參數(shù),該參數(shù)已添加到默認(rèn)情況下顯示 Context 菜單的 Widget并淋,例如 TextField
寓搬。
現(xiàn)在開(kāi)發(fā)者可以從
contextMenuBuilder
返回任何想要的 Widget,包括修改默認(rèn)的平臺(tái)自適應(yīng)的 Context 菜單县耽。
這個(gè)新功能也適用于文本選擇之外句喷,例如創(chuàng)建一個(gè) Image
,然后在右鍵單擊或長(zhǎng)按時(shí)顯示 “Save” 按鈕(code)兔毙,通過(guò) ContextMenuController
在應(yīng)用的任何位置顯示當(dāng)前平臺(tái)的默認(rèn) Context 菜單或自定義菜單唾琼。
更多可見(jiàn) Flutter Demo context_menus中的全套示例。
CupertinoListSection 和 CupertinoListTile 小部件
Cupertino 新增了兩個(gè)新的 Widget澎剥,CupertinoListSection
和CupertinoListTile
锡溯,用于顯示 iOS 風(fēng)格的可滾動(dòng)小部件列表。
它們是Material
ListView
和ListTile
的 Cupertino 版本。
滾動(dòng)改進(jìn)
3.7 版本帶來(lái)了多項(xiàng) 滾動(dòng)更新:
- 觸控板交互改進(jìn)
- 新的 Widget(如
Scrollbars
和DraggableScrollableSheet
) - 滾動(dòng) Context 文本選擇的改進(jìn)處理
值得注意的是祭饭, MacOS 應(yīng)用現(xiàn)在將通過(guò)添加新的滾動(dòng) physics 來(lái)體驗(yàn)更高的保真度以匹配桌面平臺(tái)涌乳。
另外還有新的 AnimatedGrid
和 SliverAnimatedGrid
動(dòng)畫(huà)。
最后甜癞,本次還修復(fù)了幾個(gè)滾動(dòng) Widget 的構(gòu)造函數(shù)中的問(wèn)題,例如ListView
:
在 Flutter 框架的 NNBD 遷移過(guò)程中宛乃,原本
itemBuilder
允許用戶(hù)按需提供 widgets 類(lèi)型悠咱,但是在遷移到IndexedWidgetBuilder
時(shí)不允許用戶(hù)返回 null。
這意味著 itemBuilder
不能再返回 null
征炼,而本次跟新該設(shè)定已經(jīng)通過(guò) NullableIndexedWidgetBuilder
修復(fù)析既。
國(guó)際化工具和文檔
國(guó)際化支持已經(jīng)全面改進(jìn),3.7 版本通過(guò)完全重寫(xiě)了 gen-l10n
工具來(lái)實(shí)現(xiàn)支持:
- 描述性的語(yǔ)法錯(cuò)誤
- 涉及嵌套/多個(gè)復(fù)數(shù)谆奥、選擇和占位符的復(fù)雜消息
有關(guān)更多信息眼坏,可參閱更新的 國(guó)際化 Flutter 應(yīng)用頁(yè)面。
全局選擇改進(jìn)
SelectionArea
現(xiàn)在支持鍵盤(pán)選擇酸些,開(kāi)發(fā)者可以使用鍵盤(pán)快捷鍵擴(kuò)展現(xiàn)有選擇宰译,例如 shift+right
。
后臺(tái) isolates
3.7 開(kāi)始 Platform Channels 可以從任何 Isolate
invoked 魄懂, 以前用戶(hù)只能從 Flutter 提供的主 Isolate 調(diào)用平臺(tái)通道沿侈,而現(xiàn)在 Plugins 或 Add-to-app 能更好地使用 Isolate 和主機(jī)平臺(tái)代碼進(jìn)行交互。
有關(guān)更多信息市栗,請(qǐng)查看在 flutter.dev 上的 platform-specific code 和 Introducing background isolate channels缀拭。
文本放大鏡
3.7 開(kāi)始在 Android 和 iOS 上選擇文本時(shí)出現(xiàn)的放大鏡。
對(duì)于所有帶有文本選擇的應(yīng)用填帽,這是開(kāi)箱即用的能力蛛淋,但如果你想禁用或自定義它,請(qǐng)參閱 magnifierConfiguration 屬性篡腌。
插件的快速遷移
由于 Apple 現(xiàn)在專(zhuān)注于使用 Swift 作為他們的 APIs 褐荷,我們希望開(kāi)發(fā)參考資料以幫助 Flutter 插件開(kāi)發(fā)人員使用 Swift 遷移或創(chuàng)建新插件。
quick_actions 插件已從 Objective-C 遷移到 Swift哀蘑,可用作最佳實(shí)踐的演示诚卸。如果有興趣成為幫助我們遷移插件的一員,請(qǐng)參閱wiki的 Swift 遷移部分绘迁。
適用于 iOS 開(kāi)發(fā)人員的資源合溺,我們?yōu)?iOS 開(kāi)發(fā)者發(fā)布了一些新資源,包括:
- 面向 SwiftUI 開(kāi)發(fā)者的 Flutter
- 面向 Swift 開(kāi)發(fā)人員的 Dart
- Swift 開(kāi)發(fā)者的 Flutter 并發(fā)
- 將 Flutter 添加到現(xiàn)有的 SwiftUI 應(yīng)用
- 使用 Flutter 創(chuàng)建 flavors (適用于 Android 和 iOS)
Bitcode deprecation
因此,F(xiàn)lutter 已刪除對(duì) bitcode 的支持睛约。
默認(rèn)情況下鼎俘,F(xiàn)lutter 應(yīng)用不啟用位碼,我們預(yù)計(jì)這不會(huì)影響許多開(kāi)發(fā)人員辩涝。
但是如果你在 Xcode 項(xiàng)目中手動(dòng)啟用了 bitcode贸伐,請(qǐng)?jiān)谏?jí)到 Xcode 14 后立即禁用它。
你可以通過(guò)打開(kāi) ios/Runner.xcworkspace
并將 Enable Bitcode 設(shè)置為 No 來(lái)實(shí)現(xiàn)怔揩,Add-to-app 的開(kāi)發(fā)人員可以在宿主 Xcode 項(xiàng)目中禁用它捉邢。
iOS PlatformView BackdropFilter
我們添加了在有 blurred 效果的 Flutter Widget 下方呈現(xiàn)時(shí)使原生 iOS 視圖模糊的功能,并且 UiKitView
現(xiàn)在可以包裝在 BackdropFilter
商膊。
有關(guān)詳細(xì)信息伏伐,請(qǐng)參考 iOS PlatformView BackdropFilter 設(shè)計(jì)文檔。
內(nèi)存管理
3.7 版本對(duì)內(nèi)存管理進(jìn)行了一些改進(jìn)晕拆,具體有:
- 減少垃圾收集暫停導(dǎo)致的卡頓
- 由于分配速度和后臺(tái) GC 線程而降低 CPU 利用率
- 減少內(nèi)存占用
作為一個(gè)例子藐翎,F(xiàn)lutter 擴(kuò)展了現(xiàn)有的手動(dòng)釋放支持某些 dart:ui
對(duì)象。
以前实幕,Native 資源由 Flutter 引擎持有吝镣,直到 Dart VM 垃圾回收 Dart 對(duì)象。
通過(guò)對(duì)用戶(hù)應(yīng)用的分析和我們自己的基準(zhǔn)測(cè)試昆庇,我們確定該策略不足以避免不合時(shí)宜的 GC 和過(guò)度使用內(nèi)存赤惊。
因此,在此版本中凰锡,F(xiàn)lutter 引擎添加了顯式釋放用于 Vertices
未舟、Paragraph
和 ImageShader
對(duì)象持有的原生資源的 API 。
在遷移到的 Flutter 框架基準(zhǔn)測(cè)試中掂为,這些改進(jìn)將 90% 的幀構(gòu)建時(shí)間減少了 30% 以上裕膀,最終用戶(hù)將體驗(yàn)到更流暢的動(dòng)畫(huà)和更少的卡頓。
此外勇哗,F(xiàn)lutter 引擎不再將 GPU 圖像的大小注冊(cè)到 Dart VM昼扛,這些圖像在不再需要時(shí)會(huì)由框架手動(dòng)釋放。
沿著類(lèi)似的思路欲诺,現(xiàn)在 Flutter 引擎的策略是僅向 Dart VM 報(bào)告支持 dart:ui
的 Dart 對(duì)象部分的 Native 的 shallow size 抄谐。
在基準(zhǔn)測(cè)試中,本次更改消除了在 Widget 創(chuàng)建 GPU 駐留圖像時(shí)構(gòu)建幀的同步 GC 扰法。
在此版本中蛹含,F(xiàn)lutter Engine 還更好地利用了有關(guān) Flutter 應(yīng)用狀態(tài)的信息來(lái)動(dòng)態(tài)更新 Dart VM。
Flutter 現(xiàn)在使用 Dart VM 的 RAIL Style API 在路由轉(zhuǎn)換動(dòng)畫(huà)期間進(jìn)入 低延遲模式塞颁。
在低延遲模式下浦箱,Dart VM 的內(nèi)存分配器會(huì)傾向堆增長(zhǎng)而不是垃圾收集吸耿,以避免因 GC 暫停而中斷過(guò)渡動(dòng)畫(huà)。
雖然類(lèi)似更改不會(huì)帶來(lái)任何顯著的性能改進(jìn)酷窥,但 Flutter 團(tuán)隊(duì)計(jì)劃在未來(lái)的版本中擴(kuò)展此模型的使用咽安,以進(jìn)一步消除不合時(shí)宜的 GC 暫停。
此外蓬推,本次還 修復(fù)了 Flutter 引擎空閑時(shí)通知 Dart VM 的 邏輯錯(cuò)誤妆棒,修復(fù)這些錯(cuò)誤可以防止與 GC 相關(guān)的卡頓。
最后沸伏,對(duì)于 add-to-app 的 Flutter 應(yīng)用募逞,當(dāng) Flutter 視圖不再顯示時(shí) Flutter 會(huì)通知 Dart VM 引擎,當(dāng)沒(méi)有 Flutter 視圖可見(jiàn)時(shí)馋评,Dart VM 為與視圖關(guān)聯(lián)的對(duì)象觸發(fā) GC ,此更改可以減少了 Flutter 的內(nèi)存占用刺啦。
停用 macOS 10.11 到 10.13
Flutter 不再支持 macOS 10.11 和 10.12 版本留特,3.7 版本發(fā)布后,也取消對(duì) 10.13 的支持玛瘸,這可以并將幫助團(tuán)隊(duì)大大簡(jiǎn)化代碼庫(kù)蜕青。
這也意味著在 3.7 版本及以后版本中針對(duì)穩(wěn)定的 Flutter SDK 構(gòu)建的應(yīng)用將不再適用于這些版本,并且 Flutter 支持的最低 macOS 版本增加到 10.14 Mojave糊渊。
因此右核,由于 Flutter 支持的所有 iOS 和 macOS 版本都包含 Metal 支持,OpenGL 后端已從 iOS 和 macOS 嵌入器中刪除渺绒,刪除這些后贺喝,F(xiàn)lutter 引擎的壓縮大小減少了大約 100KB绎巨。
toImageSync
3.7 版本在 dart:ui
里 添加了 Picture.toImageSync
和 Scene.toImageSync
方法瞻想。
類(lèi)似于異步
Picture.toImage
,從Picture
轉(zhuǎn)化為Image
時(shí)會(huì)從Scene.toImage.Picture.toImageSync
同步返回一個(gè)句柄谋逻,并在后臺(tái)異步進(jìn)行Image
光柵化殷绍。
當(dāng) GPU 上下文可用時(shí)染苛,圖像將保持為 GPU 常駐狀態(tài),這意味著會(huì)比 toImage
具有更快的渲染速度(生成的圖像也可以保留在 GPU 中主到,但這種優(yōu)化尚未在該場(chǎng)景中實(shí)現(xiàn)茶行。)
新的toImageSync
API 支持用例,例如:
- 快速實(shí)現(xiàn)光柵化成本高昂的圖片登钥,以便在多個(gè)幀中重復(fù)使用畔师。
- 對(duì)圖片應(yīng)用多通道濾鏡。
- 應(yīng)用自定義著色器牧牢。
例如茉唉,F(xiàn)lutter 框架 現(xiàn)在使用該 API 來(lái)提高 Android 上頁(yè)面轉(zhuǎn)換的性能固蛾,這幾乎將幀光柵化時(shí)間減半,減少卡頓度陆,并允許動(dòng)畫(huà)在支持這些刷新率的設(shè)備上達(dá)到 90/120fps艾凯。
自定義 shader 改進(jìn)
3.7 版本包含了對(duì) Flutter 對(duì)自定義片段著色器支持的大量改進(jìn)。
Flutter SDK 現(xiàn)在包含一個(gè)著色器編譯器懂傀,可將 pubspec.yaml
文件中列出的 GLSL 著色器編譯為目標(biāo)平臺(tái)的正確特定格式趾诗。
此外,自定義著色器現(xiàn)在可以熱加載蹬蚁,iOS 上的 Skia 和 Impeller 后端現(xiàn)在也支持自定義著色器恃泪。
更多可見(jiàn) docs.flutter.dev 上編寫(xiě)和使用自定義片段著色器文檔,以及 pub.dev 上的
flutter_shaders
包犀斋。
字體熱重載
以前向 pubspec.yaml
文件添加新字體需要重新運(yùn)行應(yīng)用才能看到它們贝乎,這個(gè)行為這與其他可以熱加載的 asset 不同。
現(xiàn)在叽粹,對(duì)字體清單的更改(包括添加新字體)可以熱加載到應(yīng)用中览效。
減少 iOS 設(shè)備上的動(dòng)畫(huà)卡頓
感謝 luckysmg 的開(kāi)源貢獻(xiàn)改進(jìn)減少了 iOS 上的動(dòng)畫(huà)卡頓,特別是手勢(shì)期間在主線程上添加虛擬 CADisplayLink
對(duì)象虫几,現(xiàn)在會(huì)強(qiáng)制以最大刷新率進(jìn)行刷新锤灿。
此外,鍵盤(pán)動(dòng)畫(huà)現(xiàn)在將刷新率設(shè)置為 CADisplayLink
辆脸,與 Flutter 引擎動(dòng)畫(huà)使用的刷新率相同但校。
由于這些變化,用戶(hù)應(yīng)該注意到 120Hz iOS 設(shè)備上的動(dòng)畫(huà)更加一致流暢啡氢。
最后個(gè)人感想
以上就是來(lái)自 Flutter 團(tuán)隊(duì)關(guān)于 Flutter 3.7 的主要更新內(nèi)容状囱,可以看到本次更新內(nèi)容相當(dāng)豐富:
- 最顯眼的莫過(guò)于 Impeller 在 iOS 可以預(yù)覽,性能提升未來(lái)可期
- 關(guān)于菜單相關(guān)的更新倘是,也極大豐富了 Flutter 在編輯和本次選擇中的疲弱態(tài)勢(shì)
- 全局選擇的改進(jìn)和文本放大鏡也進(jìn)一步完善了 Flutter 文本操作的生態(tài)
- 性能浪箭、內(nèi)存優(yōu)化老生常談,特別是 iOS 上的優(yōu)化
- 開(kāi)發(fā)工具進(jìn)一步提升
當(dāng)然本次大版本更新設(shè)計(jì)的內(nèi)容范圍很廣辨绊,可以預(yù)見(jiàn)會(huì)有各式各樣的坑在等大家奶栖,特別本次更新很多涉及底層 Framework 部分,所以按照慣例门坷,等三個(gè)小版本會(huì)更穩(wěn)宣鄙。
作者:戀貓de小郭
鏈接:https://juejin.cn/post/7192468840016511034