Flutter 2.5正式版发布,带来重大更新
在經過了近兩個月的版本迭代后,Flutter 官方在昨天發(fā)布了Flutter 2.5版本。根據(jù)官方的介紹,這是一個大版本更新,一共關閉了 4600 個問題,從 252 個貢獻者和 216 個審閱者合并了 3932 個 PR。
此版本延續(xù)了一些重要的性能和工具改進,同時又發(fā)布了一些新功能,包括:
- 對 Android 的全屏支持、更多 Material You(也稱為 v3)支持;
- 更新的文本編輯以支持可切換的鍵盤快捷鍵;
- 在 Widget Inspector 中更詳細地查看你的小部件;
- 在 Visual Studio Code 項目中添加依賴關系的新支持;
- 從 IntelliJ/Android Studio 的測試運行中獲取覆蓋信息的新支持;
- 以及提供一個全新的應用程序模板,為你的 real-world Flutter 應用程序提供更好的基礎。
性能:iOS 著色器預熱、異步任務、GC 和消息傳遞
此版本帶來了多項性能改進。
( #25644 ) 此列表中的第一個 PR ,主要用于從離線訓練運行中連接 Metal 著色器預編譯,它將最壞情況的幀光柵化時間減少了 2/3 秒,將第 99 個百分位幀減少了一半。然而著色器預熱只是卡頓的來源之一,在之前的版本處理來自網絡、文件系統(tǒng)、插件或其他 isolate 的異步事件都可能會中斷動畫,這是另一個卡頓的來源。
( #25789)本版本中對 UI isolate 的事件循環(huán)的調度策略( #25789)進行了改進,現(xiàn)在幀處理優(yōu)先于其他異步事件的處理,從而在測試中消除了此問題產生的卡頓。
另一個導致卡頓的原因是垃圾收集器 (GC) 暫停 UI 線程以回收內存。以前某些圖像的內存在響應 Dart VM 的 GC 執(zhí)行時會延遲回收,作為早期版本中的解決方法,Flutter 引擎會通過 Dart VM 的 GC 回收暗示圖像內存可以回收,這在理論上可以實現(xiàn)了更及時的內存回收。不幸的是這也導致了太多的主要 GC,并且有時仍然無法足夠快地回收內存。
因此,在此版本中,(#26219、#82883、#84740)解決了未使用的圖像的內存沒有被急切地回收的問題,大大降低了了VM的GC問題。
例如,在下面的測試中,播放 20 秒動畫 GIF 從需要 400 多次 GC 變?yōu)橹恍枰?4 次。更少的主要 GC 意味著涉及圖像出現(xiàn)和消失的動畫將減少卡頓,并消耗更少的 CPU 和功率。
Flutter 2.5 的另一個性能改進是在 Dart 和 Objective-C/Swift (iOS) 或 Dart 和 Java/Kotlin (Android) 之間發(fā)送消息時的延遲。
通常,作為消息傳遞的一部分,從消息編解碼器中刪除不必要的副本可將延遲減少高達 50%,不過具體數(shù)據(jù)取決于消息大小和設備(#25988,#26331)。
并且,對于 iOS 用戶而言,此版本帶來了一項重大的更新,即在 Apple Silicon M1 Mac 上構建的 Flutter 應用程序也可以在 ARM iOS 模擬器 (#85642 ) 上運行。
這意味著 Intel x86_64 指令和 ARM 之間沒有 Rosetta 轉換,從而提高你的 iOS 應用程序測試期間的性能,并允許你避免一些微妙的 Rosetta 問題(#74970、#79641),這是全面支持 Flutter的蘋果開發(fā)方面又進一步。
Dart 2.14:格式、語言特性、發(fā)布和 linting 開箱即用
此版本的 Flutter和Dart 2.14是一起發(fā)布的。
新版本的Dart 帶有新的格式,使級聯(lián)更加清晰;新的 pub 支持忽略文件,以及新的語言功能,包括三重移位運算符的回歸。此外,Dart 2.14 創(chuàng)建了一組標準的 lint,在新的 Dart 和 Flutter 項目之間共享,開箱即用。
Android 全屏、Material You & 文本編輯快捷方式
從(#81303) 開始, 我們修復了 Android 一系列與全屏模式相關的問題,此更改還添加了一種在其他模式下收聽全屏更改的方法。例如,用戶與應用互動時,當系統(tǒng) UI 返回時,開發(fā)人員現(xiàn)在可以編寫代碼在返回全屏時執(zhí)行其他操作。
在此版本中,我們對新 Material You(又名 v3)的規(guī)范增加了支持,包括對浮動操作按鈕大小和主題的更新(#86441),在MaterialState.scrolledUnder 可以使用 Demo 中的示例代碼查看的新狀態(tài) PR 式例 ( #79999 )。
另一個改進是添加了 scroll metrics notifications(#85221、#85499),即使用戶沒有滾動,它也會提供可滾動區(qū)域的提示。例如,下面顯示了 ListView 根據(jù)的列表的大小顯示滾動條。
在這種情況下不必編寫任何代碼,但如果想捕獲 ScrollMetricNotification 更改,則可以通過捕獲此監(jiān)聽來完成。
另一個出色的社區(qū)貢獻是為 ScaffoldMessenger , 你可能還記得 從Flutter 2.0 開始 ScaffoldMessenger 提供了一個更強大的方式來顯示 SnackBars , 在屏幕的底部為用戶提供通知。現(xiàn)在,從 Flutter 2.5 開始,我們可以在 Scaffold 的頂部添加一個橫幅,該橫幅會一直保持到用戶關閉它為止。
我們可以通過調用 showMaterialBanner() 方法來獲得此行為的ScaffoldMessenger,如下所示。
Material 指南規(guī)定 ,Flutter的橫幅一次只能顯示一個,如果要顯示多次,那么就需要調用多次 showMaterialBanner、ScaffoldMessenger ,兵手動維護一個隊列,在前一個橫幅已被關閉之后,再顯示一個新橫幅。
同時,在此版本中,我們添加了文本編輯鍵盤快捷鍵可覆蓋的功能( #85381),這是在 Flutter 2.0 及其新的文本編輯功能的基礎上的進一步優(yōu)化。例如,我們可以文本選擇以及能夠在處理鍵盤事件后停止它的事件傳播。
DefaultTextEditingShortcuts 類包含每個平臺上受支持的鍵盤快捷鍵列表,如果開發(fā)者想覆蓋任何內容,可以使用 Flutter 的現(xiàn)有 Shortcuts 將任何快捷方式重新映射到現(xiàn)有或自定義意圖,使用參考:DefaultTextEditingShortcuts。
插件:相機、圖像選擇器和 plus 插件
新版本對相機插件、圖像選擇器插件進行了升級和優(yōu)化,重點解決如下問題:
- #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 [camera] android-rework part 7:Android降噪功能
- #4054 [相機] android-rework 第 8 部分:最終實現(xiàn)的支持模塊
- #4010 [camera] 在 iOS 上不觸發(fā)設備方向
- #4158 [相機] 修復坐標旋轉以在 iOS 上設置焦點和曝光點
- #4197 [相機] 修復相機預覽并不總是在方向改變時重建
- #3992 [camera] 設置不受支持的 FocusMode 時防止崩潰
- #4151 [camera] 引入camera_web包
image_picker 插件也做了很多優(yōu)化,提升了端到端的相機體驗。
- #3898 [image_picker] 圖像選擇器修復相機設備
- #3956 [image_picker] 將相機捕獲的存儲位置更改為 Android 上的內部緩存,以符合新的 Google Play 存儲要求
- #4001 [image_picker] 刪除了對相機權限的冗余請求
- #4019 [image_picker] 當相機是 source 時修復旋轉問題
經過上面的優(yōu)化,改進了 Android 的相機和 image_picker 插件的功能和穩(wěn)健性。同時,在 Web 上查看相機預覽、拍照、使用閃光燈和縮放控件提供基本支持,不過目前還不是被認可的插件,因此開發(fā)者需要明確添加它以在才能在 Web 中使用。
過時API提示
在此版本的 Flutter 中,Flutter 團隊提供的每個相應插件都帶有類似 【Battery】的提示,用于表示插件是否過時。如果這些插件被標識為【Battery】,那么我們不再被積極維護,我們建議使用以下插件的 plus 版本:
Flutter DevTools:性能、Widget 檢查器和 Polish
此次, DevTools 中增加利用引擎更新的支持(#26205、#26233、#26237、#26970、#27074、#26617)。
現(xiàn)在,使用DevTools,我們可以更好地將跟蹤事件與特定框架相關聯(lián),這有助于開發(fā)人員在出現(xiàn)問題后分析問題產生的原因。
借助DevTools,我們可以Frames圖表中看到頁面被渲染的完整渲染過程,并且可以在應用程序呈現(xiàn)時填充到此圖表中,從此圖表中選擇一個幀就可以導航到該幀的時間線事件,我們可以使用這些事件來幫助診斷應用程序中的著色器編譯卡頓問題。
DevTools 會檢測何時因著色器編譯丟失幀,以便可以解決卡頓問題。這和之前使用DevTools進行內存分析的步驟是基本類似的。
此外,在跟蹤應用程序中的 CPU 性能問題時,可能會被來自 Dart 和 Flutter 庫或引擎本機代碼的分析數(shù)據(jù)淹沒,如果想關閉其他干擾,只專注于您自己的代碼,您可以使用新的 CPU Profiler 功能( #3236) 來實現(xiàn),該功能可以從這些來源中隱藏分析器信息。
對于沒有過濾掉的任何類別,它們現(xiàn)在已經進行了顏色編碼(#3310、#3324),便可以輕松查看 CPU 幀圖表來自系統(tǒng)的哪些部分。彩色框架圖,用于識別應用中的應用、原生、Dart 和 Flutter 代碼活動。
同時,此版本的 DevTools 附帶了對 Widget Inspector 的更新,允許將鼠標懸停在 Widget 來獲取評估對象、視圖屬性、小部件狀態(tài)等信息。
并且,當選擇一個 Widget 時,會自動獲取 Widget 的屬性。
除了新功能外, Widget Inspector 還進行了更新和優(yōu)化,更新后 DevTools 調試 Flutter 應用程序也更有用。
優(yōu)化和改變的內容具體表現(xiàn)如下幾個方面:
-
優(yōu)化調試切換按鈕:我們對這些按鈕進行了更新,以讓它更好的表達它們的作用,并且每個工具提示都會鏈接到該功能的詳細文檔。
-
更容易的界面分析和定位:Flutter 框架中常用的 Widget 都會在左側的 Widget 樹視圖中顯示圖標,它們根據(jù)類別進一步進行顏色編碼,例如布局 Widget 顯示為藍色,而內容Widget 顯示為綠色。
-
對齊布局資源管理器和組件樹的配色方案: 現(xiàn)在可以更輕松地從布局資源管理器和 Widget 樹中識別相同的 Widget。例如,屏幕截圖中的“列” Widget 位于布局瀏覽器中的藍色背景上,并且在 Widget 樹視圖中具有藍色圖標。
目前,DevTools一共發(fā)了多個版本,我們也很想聽聽您對這些更新的使用情況和想法,下面是DevTools 新功能的完整列表:
- Flutter DevTools 2.3.2 Release Notes
- Flutter DevTools 2.4.0 Release Notes
- Flutter DevTools 2.6.0 Release Notes
IntelliJ/Android Studio:集成測試、測試覆蓋率和圖標預覽
當然,伴隨著Flutter的更新,我們的 IntelliJ/Android Studio 插件在此版本中也進行了許多改進。首先,是添加了運行集成測試的能力 ( #5459 )。
集成測試是在設備上運行的整個應用程序的一種測試方式,測試的代碼位于 integration_test 目錄中,并使用與testWidgets() 單元測試相同的功能。
要將集成測試添加到項目,需要按照 flutter.dev 上的說明進行操作,要將測試與 IntelliJ 或 Android Studio 連接,請?zhí)砑訂蛹蓽y試的運行配置并連接設備以供測試使用。然后,再啟動后,運行測試,包括設置斷點、步進、跳過等。
此外,Flutter 最新的 IJ/AS 插件允許查看單元測試和集成測試運行的覆蓋率信息,可以從“調試”右邊的按鈕來查看測試覆蓋率的信息。
覆蓋信息會在編輯器的裝訂線中使用紅色和綠色條進行區(qū)分,在示例程序中,第 9-13 行被測試,但第 3 和 4 行沒有被測試。
最新版本還包括預覽來自 pub.dev 包中使用的圖標的新功能,這些包是圍繞 TrueType 字體文件(#5504、#5595、#5595、#5704)構建的,就像 Material 和 Cupertino 圖標支持預覽一樣。
要啟用圖標預覽,您需要告訴插件您正在使用哪些軟件包,settings/preferences 中有一個新的文本字段。
下面是 IJ/AS 插件的更多信息:
- Flutter IntelliJ Plugin M57 Release
- Flutter IntelliJ Plugin M58 Release
- Flutter IntelliJ Plugin M59 Release
- Flutter IntelliJ Plugin M60 Release
Visual Studio Code:依賴項、Fix All 和 Test Runner
Flutter 的 Visual Studio Code 插件也在此版本中進行了改進和升級,并且新增了兩個命令 “Dart: Add Dependency” 和 “Dart: Add Dev Dependency” (#3306, #3474)。
這些命令提供的功能類似于Jeroen Meijer 的 Pubspec Assist 插件,新命令開箱即用,并提供定期從 pub.dev 獲取的包類型過濾列表。
除此之外,開發(fā)者還可能對適用于 Dart 文件的“Fix All”命令(#3445、#3469)感興趣,并且可以一步修復所有與dart fix相同的問題。
當然,我們也可以通過添加 source.fixAll 到 editor.codeActionsOnSave 來設置保存運行時數(shù)據(jù),也可以啟用該 dart.previewVsCodeTestRunner 設置來測試運行的 Dart 和 Flutter 的相關內容。
Visual Studio Code 測試運行器看起來與當前的 Dart 和 Flutter 測試運行器略有不同,它會跨會話保留運行結果。 Visual Studio Code 測試運行器還添加了新的裝訂線圖標,顯示測試的最后狀態(tài),可以單擊以運行測試(或右鍵單擊以獲取上下文菜單)。
在即將發(fā)布的版本中,現(xiàn)有的 Dart 和 Flutter 測試工具將被移除,以支持新的 Visual Studio Code 測試工具。
工具:異常、新應用模板和 Pigeon 1.0
現(xiàn)在,調試器也進行了相應的升級優(yōu)化,可以在未處理的異常上正確中斷,而這些異常以前時只能被 framework 捕獲 ( #17007 )。這改善了調試體驗,因為調試器可以直接指向代碼中出現(xiàn)問題的代碼行。
自 Flutter 誕生以來,我們就使用Counter 作為應用的模板,它具有許多優(yōu)點:
- 展示了 Dart 語言的許多特性;
- 展示了幾個關鍵的 Flutter 概念,并且它足夠小;
- 可以放入單個文件中,即使有很多的解釋性評論;
盡管如此,我們還是覺得它沒有為Flutter 開發(fā)提供一個非常好的模版。因此,在此版本中,我們提供了一個新模板 ( #83530 ),創(chuàng)建的命令如下:
flutter create -t skeleton my_app
骨架模板生成一個遵循社區(qū)最佳實踐的兩頁列表視圖,并提供了下面的功能:
- 用于 ChangeNotifier 協(xié)調多個 Widget
- 默認情況下使用 arb 文件生成本地化
- 包括示例圖像并為圖像資產建立 1x、2x 和 3x 文件夾
- 使用“功能優(yōu)先”的文件夾組織
- 支持共享首選項
- 支持明暗主題
- 支持多頁面間導航
隨著時間的推移,我們會繼續(xù)完善新模板,直到他更好的為讓想要了解它的人學習它。
另一方面,我們還升級了 Pigeon ,并發(fā)布了的 1.0 版本。Pigeon 是一個代碼生成工具,用于在 Flutter 及其主機平臺之間生成類型安全的互操作代碼,它允許定義插件 API 的描述,并為 Dart、Java 和 Objective-C(分別可用于 Kotlin 和 Swift)生成框架代碼。
目前,Flutter 團隊的一些插件中已經使用了 Pigeon,在此版本中它提供了更多有用的錯誤消息,增加了對泛型、原始數(shù)據(jù)類型作為參數(shù)和返回類型以及多個參數(shù)的支持,預計開發(fā)者將來會更頻繁地使用它。
其他
除此之外,Flutter 2.5的重大更改和棄用還有如下一些:
- 默認拖動滾動設備
- 在 v2.2 之后刪除了棄用的 API
- 引入包:flutter_lints
- ThemeData 的 accent 屬性已被棄用
- 手勢識別器清理
- 用 collate 替換 AnimationSheetBuilder.display
- 使用 HTML 插槽在 Web 中呈現(xiàn)平臺視圖
- 將 LogicalKeySet 遷移到 SingleActivator
此外隨著 Flutter 2.5 的發(fā)布,我們將棄用2020 年 9 月宣布的對 iOS 8 的支持。放棄對市場份額不到 1% 的 iOS 8 的支持,使 Flutter 團隊能夠專注于更廣泛使用的新平臺,棄用意味著這些平臺可以工作,但我們不會在這些平臺上進行功能的更新和插件的支持。
參考:Flutter 2.5更新
總結
以上是生活随笔為你收集整理的Flutter 2.5正式版发布,带来重大更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Deque - leetcode 【双端
- 下一篇: evo实用指令指南