Flutter 2.5 的新特性
您好,歡迎來到 Flutter 2.5!這是一個大版本,在 Flutter 版本歷史上排名第二:關閉了 4600 個問題,從 252 個貢獻者和 216 個審閱者合并了 3932 個 PR。如果我們回顧過去一年,我們會看到 1337 位貢獻者創建了 21,072 個巨大的 PR,其中 15,172 個被合并。雖然“Flutter 中的新功能”博客文章側重于新功能,但我們在 Flutter 方面的第一項工作始終是確保您擁有所需的最高質量級別的功能。
事實上,此版本繼續了許多重要的性能和工具改進,以跟蹤您自己的應用程序中的性能問題。同時,還有許多新功能,包括對 Android 的全屏支持、更多 Material You(也稱為 v3)支持、更新的文本編輯以支持可切換的鍵盤快捷鍵、在Widget Inspector,對在 Visual Studio Code 項目中添加依賴項的新支持,對從 IntelliJ/Android Studio 中的測試運行獲取覆蓋率信息的新支持,以及一個全新的應用程序模板,為您的真實 Flutter 應用程序提供更好的基礎。此版本充滿了令人興奮的新更新,讓我們開始吧。
性能:iOS 著色器預熱、異步任務、GC 和消息傳遞
此版本帶來了多項性能改進。此列表中的第一個 PR 用于從離線訓練運行 (?#25644?) 中連接 Metal 著色器預編譯,它(如我們的基準測試所示)將最壞情況的幀光柵化時間減少了 2/3 秒,將第 99 個百分位幀減少了一半。我們繼續在減少 iOS 卡頓方面取得進展,這是沿著這條道路邁出的又一步。然而,著色器預熱只是卡頓的來源之一。以前,處理來自網絡、文件系統、插件或其他隔離的異步事件可能會中斷動畫,這是另一個卡頓的來源。以下改進調度策略 (?#25789) 在此版本的 UI 隔離的事件循環中,幀處理現在優先于處理其他異步事件,從而在我們的測試中消除了此源的卡頓。
由于前后處理異步事件結果導致的幀滯后
另一個導致卡頓的原因是垃圾收集器 (GC) 暫停 UI 線程以回收內存。以前,某些圖像的內存只會延遲回收以響應 Dart VM 執行的 GC。作為早期版本中的解決方法,Flutter 引擎會向 Dart VM 暗示圖像內存可以通過 GC 回收,這在理論上可以導致更及時的內存回收。不幸的是,在實踐中,這導致了太多的主要 GC,并且有時仍然無法足夠快地回收內存以避免內存受限設備上的低內存情況。在這個版本中,未使用的圖像的內存被急切地回收(#26219、#82883、#84740),大大減少了 GC。
添加修復程序之前和之后的 GC 以急切地回收未使用的大圖像內存
例如,在我們的一項測試中,播放 20 秒動畫 GIF 從需要 400 多次 GC 變為只需要 4 次。更少的主要 GC 意味著涉及圖像出現和消失的動畫將減少卡頓,并消耗更少的 CPU 和功率。
Flutter 2.5 的另一個性能改進是在 Dart 和 Objective-C/Swift (iOS) 或 Dart 和 Java/Kotlin (Android) 之間發送消息時的延遲。通常,作為調整消息頻道的一部分,從消息編解碼器中刪除不必要的副本可將延遲減少多達 50%,具體取決于消息大小和設備(#25988,#26331)。
之前和之后的 iOS 消息延遲
您可以在Aaron Clarke撰寫的提高 Flutter中的平臺通道性能博客文章中閱讀有關這項工作的詳細信息。
如果您的目標是 iOS,那么最后一個性能更新:在此版本中,在 Apple Silicon M1 Mac 上構建的 Flutter 應用程序在 ARM iOS 模擬器 (?#pull/85642?)上本地運行。這意味著 Intel x86_64 指令和 ARM 之間沒有 Rosetta 轉換,這提高了 iOS 應用程序測試期間的性能,并允許您避免一些微妙的 Rosetta 問題(#74970、#79641)。這是全面支持 Flutter for Apple Silicon 的又一步。請繼續關注更多。
Dart 2.14:格式、語言特性、發布和 linting 開箱即用
當然,如果沒有 Dart 語言和構建它的運行時,Flutter 就不是 Flutter。此版本的 Flutter 隨 Dart 2.14 一起發布。新版本的 Dart帶有新的格式,使級聯更加清晰,新的 pub 支持忽略文件,以及新的語言功能,包括傳奇的三重移位運算符的回歸。此外,也是 Dart 2.14 最好的事情之一,是此版本創建了一組標準的 lint,在新的 Dart 和 Flutter 項目之間共享,開箱即用。
`flutter create` 開箱即用,帶有一個 analysis_options.yaml 文件,其中預先填充了推薦的 Flutter lints
您不僅會在創建新的 Dart 或 Flutter 項目時獲得這些 lint,而且只需幾個步驟,您也可以將相同的分析添加到現有應用程序中。有關這些 lint 的詳細信息、新語言功能等,請查看Dart 2.14 的發布公告。
框架:Android 全屏、Material You & 文本編輯快捷方式
Flutter 2.5 版本包括對該框架的許多修復和改進。從Android開始,我們修復了一系列與全屏模式相關的問題,在它們之間有近 100 次豎起大拇指。模式本身的名稱使其成為我們最喜??歡的新功能之一:向后傾斜、粘性、粘性沉浸和邊緣到邊緣。此更改還添加了一種在其他模式下收聽全屏更改的方法。例如,如果用戶與應用互動,當系統 UI 返回時,開發人員現在可以編寫代碼以返回全屏或執行其他操作。
新的 Android 邊到邊模式:普通模式(左)、邊到邊模式(中)、帶有自定義 SystemUIOverlayStyle 的邊到邊(右)
在此版本中,我們繼續構建對新 Material You(又名 v3)規范的支持,包括對浮動操作按鈕大小和主題的更新(#86441),以及MaterialState.scrolledUnder您可以使用示例代碼中的示例代碼查看的新狀態公關 (?#79999?)。
新材料您的 FAB 尺寸
新的 MaterialState.scrolledUnder 狀態在起作用
當我們談論滾動時,另一個改進是添加了滾動指標通知(#85221、#85499),即使用戶沒有滾動,它也會提供可滾動區域的通知。例如,下面顯示了滾動條根據 的基礎大小適當地出現或消失ListView:
新的滾動指標通知使滾動條無需滾動即可自動出現和消失
在這種情況下,您不必編寫任何代碼,但如果您想捕獲ScrollMetricNotification更改,則可以。特別感謝社區貢獻者xu-baoolin,他為此付出了努力并提出了一個很好的解決方案。
社區的另一個出色貢獻是為ScaffoldMessenger.?你可能還記得ScaffoldMessenger從顫振2.0發布公告作為一個更強大的方式來顯示SnackBars在屏幕的底部為用戶提供通知。在 Flutter 2.5 中,您現在可以在腳手架的頂部添加一個橫幅,該橫幅會一直保持到用戶關閉它為止。
您的應用程序可以通過調用以下showMaterialBanner方法來獲得此行為ScaffoldMessenger:
橫幅的材料指南規定您的應用一次只能顯示一個,因此如果您的應用調用showMaterialBanner多次,ScaffoldMessenger則將維護一個隊列,顯示每個新橫幅,因為前一個橫幅已被關閉。感謝Calamity210對 Flutter 中的 Material 支持做出了如此出色的補充!
在 Flutter 2.0 及其新的文本編輯功能的基礎上進一步構建,例如文本選擇樞軸點以及能夠在處理后停止鍵盤事件的傳播,在此版本中,我們添加了使文本編輯鍵盤快捷鍵可覆蓋的功能(#85381)。如果您希望Ctrl-A執行一些自定義操作而不是選擇所有文本,您可以這樣做。本DefaultTextEditingShortcuts類包含每個平臺上受支持撲每鍵盤快捷鍵列表。如果您想覆蓋任何內容,請使用 Flutter 的現有Shortcuts小部件將任何快捷方式重新映射到現有或自定義意圖。您可以將該小部件放置在小部件樹中要應用覆蓋的任何位置。查看API 參考中的一些示例。
插件:相機、圖像選擇器和插件
另一個有很多改進的插件是相機插件:
- 3795?[相機] android-rework 第 1 部分:支持 Android 相機功能的基類
- 3796?[相機] android-rework 第 2 部分:Android 自動對焦功能
- 3797?[camera] android-rework part 3:Android曝光相關功能
- 3798?[相機] android-rework 第 4 部分:Android 閃光和變焦功能
- 3799?[相機] android-rework 第 5 部分:Android FPS 范圍、分辨率和傳感器方向功能
- 4039?[相機] android-rework 第 6 部分:Android 曝光和焦點功能
- 4052?[相機] android-rework 第 7 部分:Android 降噪功能
- 4054?[相機] android-rework 第 8 部分:最終實現的支持模塊
- 4010?[camera] 在 iOS 上不觸發平面設備方向
- 4158?[相機] 修復坐標旋轉以在 iOS 上設置焦點和曝光點
- 4197?[相機] 修復相機預覽并不總是在方向改變時重建
- 3992?[camera] 設置不受支持的 FocusMode 時防止崩潰
- 4151?[camera] 引入camera_web包
image_picker 插件也做了很多工作,專注于端到端的相機體驗:
- 3898?[image_picker] 圖像選擇器修復相機設備
- 3956?[image_picker] 將相機捕獲的存儲位置更改為 Android 上的內部緩存,以符合新的 Google Play 存儲要求
- 4001?[image_picker] 刪除了對相機權限的冗余請求
- 4019?[image_picker] 當相機是源時修復旋轉
這項工作改進了適用于 Android 的相機和 image_picker 插件的功能和穩健性。此外,您會注意到攝像頭插件的早期版本可用于網絡支持 (?#4151?)。此預覽為在 Web 上查看相機預覽、拍照、使用閃光燈和縮放控件提供基本支持。它目前不是認可的插件,因此您需要明確添加它以在您的網絡應用程序中使用。
最初的 Android 相機重寫工作由acoutts貢獻。相機和image_picker工作是由降落基流,一家咨詢公司,專門從事顫振和知名的上pub.dev自己的包。camera_web 的工作主要由總部位于美國的 Flutter 咨詢公司Very Good Ventures完成。非常感謝大家對 Flutter 社區的貢獻!
另一個有價值的社區貢獻是 Flutter 社區組織,以“plus”插件而聞名。在此版本的 Flutter 中,Flutter 團隊的每個相應插件現在都帶有類似以下對電池的建議:
此外,由于這些插件不再被積極維護,它們不再被標記為 Flutter 最喜歡的插件。如果您還沒有這樣做,我們建議您使用以下插件的 plus 版本:
Flutter DevTools:性能、小部件檢查器和潤色
此版本的 Flutter 對 Flutter DevTools 進行了許多改進。首先也是最重要的是 DevTools 中增加的支持以利用引擎更新(#26205、#26233、#26237、#26970、#27074、#26617)。其中一組更新使 Flutter 能夠更好地將跟蹤事件與特定框架相關聯,這有助于開發人員確定框架可能超出預算的原因。您可以在 DevTools Frames 圖表中看到這一點,該圖表已被重建為“實時”;框架在您的應用程序中呈現時填充在此圖表中。從此圖表中選擇一個幀導航到該幀的時間線事件:
Flutter 引擎現在還可以識別時間線中的著色器編譯事件。Flutter DevTools 使用這些事件來幫助您診斷應用程序中的著色器編譯卡頓。
DevTools 檢測由于著色器編譯而丟失的幀
借助這項新功能,DevTools 會檢測您何時因著色器編譯丟失幀,以便您可以解決問題。要像第一次一樣運行您的應用程序(在填充著色器緩存之前,就像為任何用戶一樣),請flutter run與--purge-persistent-cache標志一起使用。這會清除緩存以確保您重現用戶在“首次運行”或“重新打開”(iOS) 體驗中看到的環境。此功能仍在開發中,因此請提交您發現的問題的問題,或者我們可以做出的任何改進以幫助調試著色器編譯卡頓。
此外,當您跟蹤應用程序中的 CPU 性能問題時,您可能會被來自 Dart 和 Flutter 庫和/或引擎本機代碼的分析數據淹沒。如果您想關閉其中任何一個以專注于您自己的代碼,您可以使用新的 CPU Profiler 功能 (?#3236?) 來實現,該功能使您能夠從任何這些來源中隱藏分析器信息。
對于您沒有過濾掉的任何類別,它們現在已經進行了顏色編碼(#3310、#3324),以便您可以輕松查看 CPU 幀圖表的哪些部分來自系統的哪些部分。
彩色框架圖,用于識別應用中的應用、原生、Dart 和 Flutter 代碼活動
性能并不是您想要調試的唯一因素。此版本的 DevTools 附帶了對 Widget Inspector 的更新,允許您將鼠標懸停在小部件上以評估對象、視圖屬性、小部件狀態等。
而且,當您選擇一個小部件時,它會自動填充在新的小部件檢查器控制臺中,您可以在其中瀏覽小部件的屬性。
在斷點處暫停時,您還可以從控制臺計算表達式。
除了新功能外,Widget Inspector 還進行了翻新。為了讓 DevTools 成為理解和調試 Flutter 應用程序的更有用的目的地,我們與芬蘭的一家創意技術機構Codemate合作進行了一些更新。
Flutter DevTools 優化了 UX 以提高易用性
在此屏幕截圖中,您可以看到以下更改:
- 更好地傳達調試切換按鈕的作用——這些按鈕具有新圖標、面向任務的標簽,以及描述它們的作用和何時使用它們的豐富工具提示。每個工具提示進一步鏈接到該功能的詳細文檔。
- 更容易掃描和定位感興趣的小部件——Flutter 框架中常用的小部件現在在檢查器左側的小部件樹視圖中顯示圖標。它們根據類別進一步進行顏色編碼。例如,布局小部件顯示為藍色,而內容小部件顯示為綠色。此外,每個文本小部件現在顯示其內容的預覽。
- 對齊布局資源管理器和小部件樹的配色方案- 現在可以更輕松地從布局資源管理器和小部件樹中識別相同的小部件。例如,下面屏幕截圖中的“列”小部件位于布局瀏覽器中的藍色背景上,并且在小部件樹視圖中具有藍色圖標。
我們很想聽聽您對由這些更新或我們可以做出的任何其他改進引起的任何問題的想法,以確保 DevTools 運行良好。而這些亮??點僅僅是個開始。有關此版本 Flutter 的 DevTools 新功能的完整列表,請查看發行說明:
- Flutter DevTools 2.3.2 發行說明
- Flutter DevTools 2.4.0 發行說明
- Flutter DevTools 2.6.0 發行說明
IntelliJ/Android Studio:集成測試、測試覆蓋率和圖標預覽
Flutter 的 IntelliJ/Android Studio 插件在此版本中也進行了許多改進,首先是運行集成測試的能力 (?#5459?)。集成測試是在設備上運行的整個應用程序測試,位于 integration_test 目錄中,并使用與testWidgets()小部件單元測試相同的功能。
在 IntelliJ/Android Studio 中集成測試您的 Flutter 應用程序
要將集成測試添加到您的項目,請按照 flutter.dev 上的說明進行操作。要將測試與 IntelliJ 或 Android Studio 連接,請添加啟動集成測試的運行配置并連接設備以供測試使用。運行配置可以讓你運行測試,包括設置斷點、步進等。
此外,Flutter 最新的 IJ/AS 插件允許您查看單元測試和集成測試運行的覆蓋率信息。您可以從“調試”按鈕旁邊的工具欄按鈕訪問它:
覆蓋信息在編輯器的裝訂線中使用紅色和綠色條顯示。在這個例子中,第 9-13 行被測試,但第 3 和 4 行沒有被測試。
最新版本還包括預覽 pub.dev 包中使用的圖標的新功能,這些包是圍繞 TrueType 字體文件(#5504、#5595、#5677、#5704)構建的,就像 Material 和 Cupertino 圖標支持預覽一樣。
IntelliJ/Android Studio 中的圖標預覽
要啟用圖標預覽,您需要告訴插件您正在使用哪些軟件包。插件設置/首選項頁面中有一個新的文本字段:
請注意,這適用于在類中定義為靜態常量的圖標,如屏幕截圖中的示例代碼所示。它不適用于表達式,例如LineIcons.addressBook()or?LineIcons.values['code']。如果您是不使用此功能的圖標包的作者,請創建一個問題。
這是 Flutter 的 IntelliJ/Android Studio 插件的更多更新,您可以在發行說明中閱讀:
- Flutter IntelliJ 插件 M57 發布
- Flutter IntelliJ 插件 M58 發布
- Flutter IntelliJ 插件 M59 發布
- Flutter IntelliJ 插件 M60 發布
Visual Studio Code:依賴項、Fix All 和 Test Runner
Flutter 的 Visual Studio Code 插件也在此版本中得到了改進,從兩個新命令“Dart:添加依賴項”和“Dart:添加開發依賴項”(#3306,#3474)開始。
在 Visual Studio Code 中添加 Dart 依賴項
這些命令提供的功能類似于Jeroen Meijer 的 Pubspec Assist 插件已經提供了一段時間。這些新命令開箱即用,并提供定期從 pub.dev 獲取的包類型過濾列表。
您可能還對可用于 Dart 文件的“全部修復”命令(#3445、#3469)感興趣,并且可以一步修復所有與dart fix相同的問題。
使用 Flutter Fix 規則修復代碼中的所有已知問題
這也可以通過添加source.fixAll到editor.codeActionsOnSaveVS Code 設置來設置為在保存時運行。
或者,如果您想嘗試預覽功能,您可以啟用該dart.previewVsCodeTestRunner設置并查看通過新的 Visual Studio Code 測試運行程序運行的 Dart 和 Flutter 測試。
使用新的 Visual Studio Code 測試運行程序測試您的 Dart 和 Flutter 代碼
Visual Studio Code 測試運行器看起來與當前的 Dart 和 Flutter 測試運行器略有不同,它將跨會話保留結果。Visual Studio Code 測試運行器還添加了新的裝訂線圖標,顯示測試的最后狀態,可以單擊以運行測試(或右鍵單擊上下文菜單)。
在即將發布的版本中,現有的 Dart 和 Flutter 測試運行器將被移除,以支持新的 Visual Studio Code 測試運行器。
這只是 Visual Studio Code 新功能和修復的冰山一角。有關所有詳細信息,請查看發行說明:
- v3.26?VS Code Test Runner 集成,Flutter 創建設置,...
- v3.25額外的依賴管理改進,修復所有文件/保存時,......
- v3.24依賴樹改進,更容易啟動配置,編輯器改進
- v3.23?Profile Mode 改進,改進的依賴關系樹,LSP 改進
工具:例外、新應用模板和 Pigeon 1.0
在以前的 Flutter 版本中,您可能對期望未處理的異常感到沮喪,以便您可以觸發調試器并找出它們的來源,結果卻發現 Flutter 框架沒有讓異常通過以觸發“未處理的調試器中的expectation”處理程序。在此版本中,調試器現在可以在未處理的異常上正確中斷,而這些異常以前剛剛被框架捕獲 (?#17007?)。這改善了調試體驗,因為您的調試器現在可以將您直接指向他們代碼中的拋出行,而不是指向框架深處的隨機行。一個相關的新功能使您能夠決定 FutureBuilder 是否應該重新拋出或吞下錯誤 (#?84308)。這應該會為您提供大量額外的例外情況,以幫助您追蹤 Flutter 應用程序中的問題。
自 Flutter 誕生以來,就出現了 Counter 應用模板,它具有許多優點:它展示了 Dart 語言的許多特性,展示了幾個關鍵的 Flutter 概念,并且它足夠小,可以放入單個文件中,即使有很多的解釋性評論。然而,它沒有為現實世界的 Flutter 應用程序提供一個特別好的起點。在此版本中,通過以下命令提供了一個新模板 (?#83530?):
$?flutter create -t skeleton my_app
新的 Flutter 骨架模板在起作用
骨架模板生成遵循社區最佳實踐的兩頁列表視圖 Flutter 應用程序(帶有詳細信息視圖)。它的開發經過大量內部和外部審查,為構建生產質量應用程序提供了更好的基礎,并支持以下功能:
- 用于ChangeNotifier協調多個小部件
- 默認情況下使用 arb 文件生成本地化
- 包括示例圖像并為圖像資產建立 1x、2x 和 3x 文件夾
- 使用“功能優先”的文件夾組織
- 支持共享首選項
- 支持明暗主題
- 支持多頁面間導航
隨著時間的推移,隨著 Flutter 最佳實踐的發展,預計這個新模板也會隨之發展。
另一方面,如果您正在開發插件而不是應用程序,那么您可能會對 Pigeon 的 1.0 版本感興趣。Pigeon 是一個代碼生成工具,用于在 Flutter 及其主機平臺之間生成類型安全的互操作代碼。它允許您定義插件 API 的描述,并為 Dart、Java 和 Objective-C(分別可用于 Kotlin 和 Swift)生成框架代碼。
示例生成的 Pigeon 代碼
Flutter 團隊的一些插件中已經使用了 Pigeon。在此版本中,它提供了更多有用的錯誤消息,增加了對泛型、原始數據類型作為參數和返回類型以及多個參數的支持,預計將來會更頻繁地使用它。如果您想在自己的插件或添加到應用程序項目中利用 Pigeon,可以在Pigeon 插件頁面找到更多信息。
重大更改和棄用
以下是 Flutter 2.5 版本中的重大變化:
- 默認拖動滾動設備
- 在 v2.2 之后刪除了棄用的 API
- 引入包:flutter_lints
- ThemeData 的重音屬性已被棄用
- 手勢識別器清理
- 用 collat??e 替換 AnimationSheetBuilder.display
- 使用 HTML 插槽在 Web 中呈現平臺視圖
- 將 LogicalKeySet 遷移到 SingleActivator
有關自 1.17 版本以來重大更改的完整列表,請參閱 flutter.dev。
隨著我們繼續更新 Flutter Fix(在您的 IDE 中和通過dart fix命令可用),我們總共有 157 條規則來自動遷移受這些或過去的重大更改以及任何棄用影響的代碼。一如既往,非常感謝社區貢獻測試,他們幫助我們識別這些重大變化。要了解更多信息,請查看我們的重大變更政策。
此外,隨著 Flutter 2.5 的發布,我們將棄用2020 年 9 月宣布的對 iOS 8 的支持。放棄對市場份額不到 1% 的 iOS 8 的支持,使 Flutter 團隊能夠專注于更廣泛使用的新平臺。棄用意味著這些平臺可以工作,但我們不會在這些平臺上測試 Flutter 的新版本或插件。您可以在 flutter.dev 上查看當前支持的 Flutter 平臺列表。
概括
最后,一如既往地感謝世界各地的 Flutter 社區讓這一切成為可能。對于在此更新中貢獻和審查了 1000 個 PR 的數百名開發人員,這里是您每項努力的成果。我們正在共同努力為世界各地的開發人員轉變應用程序開發流程,以便您可以從單個代碼庫中交付更多、更快、部署到您關心的平臺。
請繼續關注 Google Flutter 團隊的更多更新。年還沒有結束!
總結
以上是生活随笔為你收集整理的Flutter 2.5 的新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis开发与运维之第八章理解内存(五
- 下一篇: 平安城市与智慧城市对接的关键要素