Flutter 2.5 發(fā)布啦,快來看看新特性
Flutter 2.5 是 Flutter 版本歷史上排名第二的大版本更新,該版本:
關(guān)閉了 4600 個 issues; 合并了 252 contributors 和 216 reviewers 的 3932 個 PR; 回顧過去一年,可以看到有 1337 位 contributors 創(chuàng)建了 21,072 個 PR 這樣龐大的數(shù)據(jù),其中有15,172 個被合并。
事實上該版本依然是對性能和開發(fā)工具進行了改進,同時還有增加許多新功能,包括:
對 Android 的全屏支持、更多 Material You(也稱為 v3)支持; 更新文本編輯功能以支持可切換的鍵盤快捷鍵; Widget Inspector 可查閱更多詳細信息; Visual Studio Code 項目中對添加依賴項增加新的支持; IntelliJ/Android Studio 中新增測試運行獲取覆蓋率信息; 一個全新的應用程序模板,為 Flutter 應用程序提供更好的開發(fā)基礎; 性能:iOS 著色器預熱、異步任務、GC 和消息傳遞
#25644 中的第一個 PR 就是用于離線訓練運行 Metal 著色器預編譯,如基準測試所示,它將最壞情況的幀光柵化時間減少了 2/3 秒,將第 99 個百分位幀減少了一半。
然而著色器預熱只是卡頓的來源之一,在之前的版本處理來自網(wǎng)絡、文件系統(tǒng)、插件或其他 isolate 的異步事件都可能會中斷動畫,這是另一個卡頓的來源。
所以 #25789 改進了調(diào)度策略,在此版本 isolate 的 UI 事件循環(huán)里,幀處理現(xiàn)在優(yōu)先于處理其他異步事件,從而在測試中消除了此類的卡頓。
另一個導致卡頓的原因是垃圾收集器 (GC) 暫停 UI 線程以回收內(nèi)存。
以前某些圖像的內(nèi)存在響應 Dart VM 的 GC 執(zhí)行時會延遲回收,作為早期版本中的解決方法,F(xiàn)lutter 引擎會通過 Dart VM 的 GC 回收暗示圖像內(nèi)存可以回收,這在理論上可以實現(xiàn)了更及時的內(nèi)存回收。
不幸的是這也導致了太多的主要 GC,并且有時仍然無法足夠快地回收內(nèi)存,以避免內(nèi)存受限設備上的低內(nèi)存情況,而在這個版本中未使用的圖像的內(nèi)存被急切地回收(#26219、#82883、#84740),大大減少了 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ā)送消息時的延遲。
通常作為調(diào)整 消息頻道的一部分,從消息編解碼器中刪除不必要的副本可將延遲減少高達 50% ,當然具體取決于消息大小和設備(#25988,#26331)。
Dart 2.14:格式、語言特性、發(fā)布和 linting 開箱即用
此版本的 Flutter 和 Dart 2.14 一起發(fā)布。
新版本的 Dart 帶有新的格式,使級聯(lián) 更加清晰,新的 pub 支持忽略文件,以及新的語言功能,包括三重移位運算符的回歸。
此外 Dart 2.14 創(chuàng)建了一組標準的 lint,在新的 Dart 和 Flutter 項目之間共享,開箱即用。
開發(fā)者不僅會在創(chuàng)建新的 Dart 或 Flutter 項目時獲得這些 lint,而且只需幾個步驟就可以將相同的分析添加到現(xiàn)有應用程序中。
Framework:Android 全屏、Material You & 文本編輯快捷方式
從 #81303 開始, 我們修復了 Android 一系列與全屏模式相關(guān)的問題,此更改還添加了一種在其他模式下收聽全屏更改的方法。
例如用戶與應用互動時,當系統(tǒng) UI 返回時,開發(fā)人員現(xiàn)在可以編寫代碼在返回全屏時執(zhí)行其他操作。
新的 Android 全屏模式:普通模式(左)、邊到邊模式(中)、帶有自定義 SystemUIOverlayStyle 的邊到邊(右)
在此版本中,我們對新 Material You(又名 v3)的規(guī)范增加了支持,包括對浮動操作按鈕大小和主題的更新(#86441),在
MaterialState.scrolledUnder可以使用 Demo 中的示例代碼查看的新狀態(tài) PR 式例 ( #79999 )。
圖片過大,截圖處理
新的 MaterialState.scrolledUnder 狀態(tài)在起作用
另一個改進是添加了 scroll metrics notifications(#85221、#85499),即使用戶沒有滾動,它也會提供可滾動區(qū)域的通知,例如下面顯示了
ListView根據(jù)的基礎大小適當?shù)爻霈F(xiàn)或消失滾動條:
圖片過大,截圖處理
在這種情況下不必編寫任何代碼,但如果想捕獲
ScrollMetricNotification更改,則可以通過此監(jiān)聽來完成。特別感謝社區(qū)貢獻者xu-baoolin,他為此付出了努力并提出了一個很好的解決方案。
另一個出色的社區(qū)貢獻是為
ScaffoldMessenger, 你可能還記得 Flutter 2.0 開始ScaffoldMessenger作為一個更強大的方式來顯示SnackBars, 在屏幕的底部為用戶提供通知,而在 Flutter 2.5 中,現(xiàn)在可以在Scaffold的頂部添加一個橫幅,該橫幅會一直保持到用戶關(guān)閉它為止。
圖片過大,截圖處理
應用程序可以通過調(diào)用以下
showMaterialBanner方法來獲得此行為ScaffoldMessenger:class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: const Text('The MaterialBanner is below'),
),
body: Center(
child: ElevatedButton(
child: const Text('Show MaterialBanner'),
onPressed: () => ScaffoldMessenger.of(context).showMaterialBanner(
MaterialBanner(
content: const Text('Hello, I am a Material Banner'),
leading: const Icon(Icons.info),
backgroundColor: Colors.yellow,
actions: [
TextButton(
child: const Text('Dismiss'),
onPressed: () => ScaffoldMessenger.of(context)
.hideCurrentMaterialBanner(),
),
],
),
),
),
),
);
}Material 指南規(guī)定 開發(fā)者的應用橫幅一次只能顯示一個,因此如果你調(diào)用多次
showMaterialBanner,ScaffoldMessenger它將維護一個隊列,在前一個橫幅已被關(guān)閉之后,再顯示一個新橫幅。感謝 Calamity210 對 Flutter 中的 Material 支持做出了如此出色的補充!
在此版本中,我們添加了文本編輯鍵盤快捷鍵可覆蓋的功能 #85381,這是在 Flutter 2.0 及其新的文本編輯功能的基礎上進一步構(gòu)建,例如文本選擇以及能夠在處理鍵盤事件后停止它的傳播。
如果您希望 Ctrl-A 執(zhí)行一些自定義操作而不是選擇所有文本。
DefaultTextEditingShortcuts類包含每個平臺上受支持的鍵盤快捷鍵列表,如果開發(fā)者想覆蓋任何內(nèi)容,可以使用 Flutter 的現(xiàn)有Shortcuts將任何快捷方式重新映射到現(xiàn)有或自定義意圖。插件:相機、圖像選擇器和 plus 插件
另一個具有有很多改進的插件是相機插件:
#3795 [相機] android-rework 第 1 部分:支持 Android 相機功能的基類 #3796 [相機] android-rework 第 2 部分:Android 自動對焦功能 #3797 [camera] android-rework part 3:Android曝光相關(guān)功能 #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 [相機] 修復坐標旋轉(zhuǎn)以在 iOS 上設置焦點和曝光點 #4197 [相機] 修復相機預覽并不總是在方向改變時重建 #3992 [camera] 設置不受支持的 FocusMode 時防止崩潰 #4151 [camera] 引入camera_web包 image_picker 插件 也做了很多工作,專注于端到端的相機體驗:
#3898 [image_picker] 圖像選擇器修復相機設備 #3956 [image_picker] 將相機捕獲的存儲位置更改為 Android 上的內(nèi)部緩存,以符合新的 Google Play 存儲要求 #4001 [image_picker] 刪除了對相機權(quán)限的冗余請求 #4019 [image_picker] 當相機是 source 時修復旋轉(zhuǎn) 這項工作改進了 Android 的相機和 image_picker 插件的功能和穩(wěn)健性。
此外你會注意到 攝像頭插件 的早期版本可用于網(wǎng)絡支持 ( #4151 )。
此預覽為在 Web 上查看相機預覽、拍照、使用閃光燈和縮放控件提供基本支持,它目前還不是被認可的插件,因此您需要明確添加它以在才能在 web 中使用。
在此版本的 Flutter 中,F(xiàn)lutter 團隊的每個相應插件現(xiàn)在都帶有一個類似 電池 的建議:
此外,由于這些插件不再被積極維護,它們不再被標記為 Flutter 最喜歡的插件,我們建議使用以下插件的 plus 版本:
Flutter DevTools:性能、Widget 檢查器和 Polish
首先最重要的是 DevTools 中增加利用引擎更新的支持(#26205、#26233、#26237、#26970、#27074、#26617)。
其中一組更新使 Flutter 能夠更好地將跟蹤事件與特定框架相關(guān)聯(lián),這有助于開發(fā)人員確定框架可能超出預算的原因。
可以在 DevTools Frames 圖表中看到這一點,該圖表已被重建為“實時”,可以在應用程序呈現(xiàn)時填充在此圖表中,從此圖表中選擇一個幀導航到該幀的時間線事件:
Flutter 引擎現(xiàn)在還可以識別時間線中的著色器編譯事件,F(xiàn)lutter DevTools 使用這些事件來幫助診斷應用程序中的著色器編譯卡頓。
借助這項新功能,DevTools 會檢測何時因著色器編譯丟失幀,以便可以解決卡頓問題。
在
flutter run時與--purge-persistent-cache標志一起使用,這會清除緩存以確保重現(xiàn)用戶在 “首次運行” 或 “重新打開” (iOS) 體驗中看到的環(huán)境。此外跟蹤應用程序中的 CPU 性能問題時,可能會被來自 Dart 和 Flutter 庫或引擎本機代碼的分析數(shù)據(jù)淹沒,如果想關(guān)閉其中任何一個以專注于您自己的代碼,您可以使用新的 CPU Profiler 功能 #3236 來實現(xiàn),該功能可以從這些來源中隱藏分析器信息。
對于沒有過濾掉的任何類別,它們現(xiàn)在已經(jīng)進行了顏色編碼(#3310、#3324),以便可以輕松查看 CPU 幀圖表來自系統(tǒng)的哪些部分。
彩色框架圖,用于識別應用中的應用、原生、Dart 和 Flutter 代碼活動
性能并不時調(diào)試的唯一因素,此版本的 DevTools 附帶了對 Widget Inspector 的更新,允許將鼠標懸停在 Widget 時評估對象、視圖屬性、小部件狀態(tài)等。
而當選擇一個 Widget 時,它會自動填充在新的小部件檢查器控制臺中,這樣就可以在其中瀏覽 Widget 的屬性。
在斷點處暫停時還可以從控制臺計算表達式。
除了新功能外 Widget Inspector 還進行了翻新,為了讓 DevTools 成為了解和調(diào)試 Flutter 應用程序的更有用,我們與芬蘭的一家創(chuàng)意技術(shù)機構(gòu)Codemate合作進行了一些更新。
在此屏幕截圖中可以看到以下更改:
更好地傳達調(diào)試切換按鈕的作用——這些按鈕具有新圖標、面向任務的標簽,以及描述它們的作用和何時使用它們的豐富工具提示,每個工具提示進一步鏈接到該功能的詳細文檔。 更容易掃描和定位感興趣的 Widgets——Flutter 框架中常用的 Widget 現(xiàn)在在檢查器左側(cè)的 Widget 樹視圖中顯示圖標,它們根據(jù)類別進一步進行顏色編碼,例如布局 Widget 顯示為藍色,而內(nèi)容Widget 顯示為綠色。此外每個文本 Widget 現(xiàn)在顯示其內(nèi)容的預覽。 對齊布局資源管理器和小部件樹的配色方案- 現(xiàn)在可以更輕松地從布局資源管理器和 Widget 樹中識別相同的 Widget。例如屏幕截圖中的“列” Widget 位于布局瀏覽器中的藍色背景上,并且在 Widget 樹視圖中具有藍色圖標。 IntelliJ/Android Studio:集成測試、測試覆蓋率和圖標預覽
Flutter 的 IntelliJ/Android Studio 插件在此版本中也進行了許多改進,首先是運行集成測試的能力 ( #5459 )。
集成測試是在設備上運行的整個應用程序測試,位于 integration_test 目錄中,并使用與
testWidgets()單元測試相同的功能。要將集成測試添加到項目,請 按照 flutter.dev 上的說明進行操作,要將測試與 IntelliJ 或 Android Studio 連接,請?zhí)砑訂蛹蓽y試的運行配置并連接設備以供測試使用,運行配置可以讓開發(fā)者運行測試,包括設置斷點、步進等。
此外,F(xiàn)lutter 最新的 IJ/AS 插件允許查看單元測試和集成測試運行的覆蓋率信息,可以從“調(diào)試”按鈕旁邊的工具欄按鈕訪問它:
覆蓋信息在編輯器的裝訂線中使用紅色和綠色條顯示,在這個例子中第 9-13 行被測試,但第 3 和 4 行沒有被測試。
最新版本還包括預覽來自 pub.dev 包中使用的圖標的新功能,這些包是圍繞 TrueType 字體文件(#5504、#5595、#5677、#5704)構(gòu)建的,就像 Material 和 Cupertino 圖標支持預覽一樣。
要啟用圖標預覽,您需要告訴插件您正在使用哪些軟件包,settings/preferences 中有一個新的文本字段:
請注意,如屏幕截圖中的示例代碼所示,此設置僅適用于在類中定義為靜態(tài)常量的圖標,它不適用于表達式,例如
LineIcons.addressBook()orLineIcons.values['code']。Visual Studio Code:依賴項、Fix All 和 Test Runner
Flutter 的 Visual Studio Code 插件也在此版本中得到了改進,兩個新命令 “Dart: Add Dependency” and “Dart: Add Dev Dependency” (#3306, #3474)。
這些命令提供的功能類似于Jeroen Meijer 的 Pubspec Assist 插件,新命令開箱即用,并提供定期從 pub.dev 獲取的包類型過濾列表。
開發(fā)者可能還對適用于 Dart 文件的“Fix All”命令(#3445、#3469)感興趣,并且可以一步修復所有與dart fix相同的問題。
這也可以通過添加
source.fixAll到editor.codeActionsOnSave的 VS Code 設置來設置為在保存時運行,或者想嘗試預覽功能,可以啟用該dart.previewVsCodeTestRunner設置并查看通過新的 Visual Studio Code 測試運行程序運行的 Dart 和 Flutter 測試。Visual Studio Code 測試運行器看起來與當前的 Dart 和 Flutter 測試運行器略有不同,它將跨會話保留結(jié)果。Visual Studio Code 測試運行器還添加了新的裝訂線圖標,顯示測試的最后狀態(tài),可以單擊以運行測試(或右鍵單擊以獲取上下文菜單)。
在即將發(fā)布的版本中,現(xiàn)有的 Dart 和 Flutter 測試運行器將被移除,以支持新的 Visual Studio Code 測試運行器。
工具:異常、新應用模板和 Pigeon 1.0
在此版本中,調(diào)試器現(xiàn)在可以在未處理的異常上正確中斷,而這些異常以前時被 framework 捕獲 ( #17007 )。
這改善了調(diào)試體驗,因為調(diào)試器現(xiàn)在可以直接指向他們在代碼中的拋出行,而不是指向框架深處的隨機行。
一個相關(guān)的新功能使開發(fā)者能夠決定 FutureBuilder 是否應該重新拋出或吞下錯誤 (#84308),這應該會為開發(fā)者提供大量額外的例外情況,以幫助追蹤 Flutter 應用程序中的問題。
自 Flutter 誕生以來,就出現(xiàn)了 Counter 應用模板,它具有許多優(yōu)點:
它展示了 Dart 語言的許多特性; 展示了幾個關(guān)鍵的 Flutter 概念,并且它足夠??; 可以放入單個文件中,即使有很多的解釋性評論; 然而它沒有為Flutter 應用程序提供一個特別好的起點,在此版本中,通過以下命令提供了一個新模板 ( #83530 ):
$ flutter create -t skeleton my_app
圖片過大,截圖處理
骨架模板生成一個遵循社區(qū)最佳實踐的兩頁列表視圖,它的開發(fā)經(jīng)過大量內(nèi)部和外部審查,為構(gòu)建生產(chǎn)質(zhì)量應用程序提供了更好的基礎,并支持以下功能:
用于 ChangeNotifier協(xié)調(diào)多個 Widget默認情況下使用 arb 文件生成本地化 包括示例圖像并為圖像資產(chǎn)建立 1x、2x 和 3x 文件夾 使用“功能優(yōu)先”的文件夾組織 支持共享首選項 支持明暗主題 支持多頁面間導航 隨著時間的推移,隨著 Flutter 最佳實踐的發(fā)展預計這個新模板也會隨之發(fā)展。
另一方面,如果你正在開發(fā)插件而不是應用程序,那么可能會對 Pigeon 的 1.0 版本感興趣。
Pigeon 是一個代碼生成工具,用于在 Flutter 及其主機平臺之間生成類型安全的互操作代碼,它允許定義插件 API 的描述,并為 Dart、Java 和 Objective-C(分別可用于 Kotlin 和 Swift)生成框架代碼。
Flutter 團隊的一些插件中已經(jīng)使用了 Pigeon,在此版本中它提供了更多有用的錯誤消息,增加了對泛型、原始數(shù)據(jù)類型作為參數(shù)和返回類型以及多個參數(shù)的支持,預計開發(fā)者將來會更頻繁地使用它。
重大更改和棄用
以下是 Flutter 2.5 版本中的重大變化:
默認拖動滾動設備 在 v2.2 之后刪除了棄用的 API 引入包:flutter_lints ThemeData 的 accent 屬性已被棄用 GestureRecognizer Cleanup 用 collate 替換 AnimationSheetBuilder.display 使用 HTML 插槽在 Web 中呈現(xiàn)平臺視圖 將 LogicalKeySet 遷移到 SingleActivator 隨著繼續(xù)更新 Flutter Fix(在您的 IDE 中和通過
dart fix命令可用),總共有 157 條規(guī)則來自動遷移受這些或過去的重大更改以及任何棄用影響的代碼。此外隨著 Flutter 2.5 的發(fā)布,我們將棄用2020 年 9 月宣布的對 iOS 8 的支持。放棄對市場份額不到 1% 的 iOS 8 的支持,使 Flutter 團隊能夠?qū)W⒂诟鼜V泛使用的新平臺,棄用意味著這些平臺可以工作,但我們不會在這些平臺上測試 Flutter 的新版本或插件。
轉(zhuǎn)自:掘金 戀貓de小郭
https://juejin.cn/post/7005739140452974599
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。





























