前幾天,Flutter 2.10 釋出了正式版本,該版本距離上個版本的釋出還不到兩個月時間,但即使在這麼短的時間內,Flutter 已經關閉了 1843 個問題,合併了 1525 個 PR。
在2.10版本中,主要的更新內容包括對Flutter的Windows支援的一個大更新,幾個顯著的效能改進,框架中的圖示和顏色的新支援,以及一些工具的改進。此外,我們還獲得了一些關於刪除開發頻道、減少對舊版本iOS的支援的更新,以及一些重大變化。
Flutter Windows 桌面端支援進入穩定版
Flutter 跨平臺框架的目的就是致力於打造一個能夠構建精美的、可高度定製的、並且可以編譯為機器碼的跨平臺應用解決方案,以充分發揮裝置底層硬體的全部圖形渲染能力。現在,Flutter 對 Windows 生產版本的正式支援標誌著這一願景的實現。它使 Windows 開發者也能享受到移動開發的相同生產力和功能。
當然,Windows 上的 Flutter 應用程式除了可以使用 iOS 和 Android 上的大部分常用 Flutter 框架外,它們也可以根據需要使用 Win32、COM 和 Windows Runtime APIs等Windows特有的功能。同時,Google還更新了一些常見的 Flutter 外掛,以支援 Windows,如相機、file_picker 和 shared_preferences等外掛。
如果想要了解更多有關Flutter For Windows的內容,此文深度介紹了Windows上的Flutter架構,允以Flutter包和外掛如何支援Windows。
效能改進
此版本的Flutter對社群成員knopp提出的髒區域管理提供支援。如果啟用此功能可以在iOS/Metal上為單個髒區域執行重繪。這一變化的好處是在一些基準上減少了90到99個百分點的柵格化時間(所謂柵格化,是指將向量圖形格式表示的影像轉換成點陣圖以用於顯示器或者印表機輸出的過程),並將這些基準上的GPU利用率從超過90%降低到不到10%,如下圖所示。
並且,我們希望在未來的版本中將部分重繪的好處帶給其他平臺。
在Flutter 2.8版本中,我們獲得了圖片的錄製過程。在Flutter 2.10,我們已經開始優化構建過程。一個最明顯的例子是,我們在構建不透明層的時候基準中的幀光柵所花的時間下降到了之前的三分之一以下。
隨著我們對影像構建流程的深入,我們希望能夠將這種優化擴充套件到更多的使用場景。
在profile和release模式下,Dart程式碼會提前被編譯為機器碼。不過,這段程式碼的效率的關鍵是完整的程式型別流分析,它可以解鎖許多編譯器優化和積極的樹狀優化。然而,由於型別流分析必須覆蓋整個程式,它可能有點昂貴。這個版本包含了一個更快的型別流分析實現。從的來說,使用新的構建方式後,Flutter應用程式的總體構建時間下降了約10%。
與以往的版本一樣,效能增強、減少記憶體使用和減少延遲是Flutter團隊的需要解決的首要任務,我們期待在未來的版本中得到進一步的改進。
iOS更新
除了效能改進之外,我們還新增了特定平臺的特性和功能的增強。luckysmg可以讓鍵盤動畫是iOS上更加流暢,當需要彈出軟鍵盤時,新的動畫效果將會更加流暢,而不需要開發中做任何的事情。
同時,我們還改善了iOS相機外掛的穩定性,修復了一些邊緣情況下的崩潰。最後,64位iOS架構壓縮指標帶來了記憶體使用的降低。
我們知道,64位體系結構能夠將指標表示為4位元組的資料結構。當有很多物件時,指標本身佔用的空間會增加應用程式的總記憶體使用,特別是遇到複雜的應用程式時,有出現更多的垃圾回收的情況。但是,iOS應用程式不太可能有足夠的物件來申請32位地址空間,更不用說更大的64位地址空間了。
Dart 2.15版本提供了壓縮指標,它可以減少64位iOS應用程式的記憶體使用。相關介紹可以檢視:Dart 2.15的部落格文章來了解細節。
Android更新
當然,這個版本也包含了許多針對Android的改進。我們知道,預設情況下,當我們建立一個新的Flutter應用程式時,Flutter會預設支援最新版本的Android。此外,在這個版本中,我們還自動啟用了multidex支援。如果您的應用程式支援Android SDK版本低於21,並且超過64K方法限制,只需在使用flutter build appbundle
或flutter build apk
命令時新增--multidex
屬性即可。
最後,我們還修復了社群反饋的Gradle錯誤。也正是出於這個原因,我們在建立Flutter應用程式時,需要新增最低支援的Android SDK版本,如下所示。
當然,我們繼續跟蹤社群反饋的問題,並在最新版本中提出修復方案。
Web 更新
這個版本在Web方面也進行了一些改進。例如,在以前的版本中,當在web上滾動到多行TextField的邊緣時,它不會正常滾動。這個版本為文字選擇引入了邊緣滾動,當選擇移動到文字欄位之外時,欄位也可以滾動以檢視滾動範圍。這種新行為適用於網頁和桌面應用。
此外,這個版本的還提供了其他一些改進來提升Web效能。我們一直在尋找一種可以減少Web效能開銷的方法。在以前的版本中,我們想把一個原生HTML小部件引入Flutter應用程式,我們需要對HTML小部件進行覆蓋重寫,然後作為支援web的一部分。如果您的應用程式中有大量的原生HTML小部件,比如連結,這將增加大量的開銷。在這個版本中,我們為web建立了一個新的“非繪製平臺檢視”,從本質上消除了這種開銷。我們已經利用了這個優化對連結小部件進行了處理,這意味著如果在你的Web應用程式中有很多連結,將不會有任何顯著的開銷。
素材
在這個版本我們對整體的配色方案也進行了升級,包括支援漸變顏色。
final lightScheme = ColorScheme.fromSeed(seedColor: Colors.green);
final darkScheme = ColorScheme.fromSeed(seedColor: Colors.green, brightness: Brightness.dark);
ThemeData函式中有一個新的colorSchemeSeed引數,允許開發者生成需要的主題配色方案:
final lightTheme = ThemeData(colorSchemeSeed: Colors.orange, …);
final darkTheme = ThemeData(colorSchemeSeed: Colors.orange, brightness: Brightness.dark, …);
此外,這個版本提供的ThemeData.useMaterial3
引數,可以將元件切換到新的Material3外觀。並且,我們還新增了1028個新的材質圖示。
整合測試改進
在2020年12月,我們提供了一個integration_test包進行端到端的測試。這個新包取代了flutter_driver包成為整合測試的推薦方式,並且還提供了新功能,比如Firebase Test Lab支援,以及對web和桌面的支援。
從那時起,我們在整合測試方面做了進一步的改進,包括將integration_test包繫結到Flutter SDK本身,使它更容易與應用程式整合。如果想要將現有的flutter_driver測試遷移到integration_test,我們也提供了遷移指南。
Flutter官方的文件、樣例和程式碼也使用integration_test進行了更新。想要了解更多有關integration_test的內容,可以點選 Testing Flutter apps。
Flutter DevTools
在這個版本,我們也對Flutter DevTools進行了升級和更新,包括一個易於使用的特性,如果我們用命令列使用DevTools,而不是使用pub全域性啟用來下載和執行最新版本。那麼,現在我們現在也可以使用dart devtools
命令來獲得最新的版本。
同時,我們還做了一些可用性的更新,包括改進了在Debugger變數窗格中檢查大型列表和地圖的支援。
最後,誠邀官大開發中提供DevTools的使用體驗並反饋給我們,這將有助於我們進行更深層次的改善和優化。
VSCode改進
除此之外,Visual Studio對Flutter的支援也得到了進一步的增強,包括程式碼中更多地方的顏色預覽和顏色選擇器,可以方便開發中檢視效果。
此外,如果您想成為VSCode的Dart和Flutter預發行版本的測試人員,您可以在擴充套件設定中切換到預發行版本。
如果想要了解更多詳細資訊和內容,可以參考:
移除dev channel
在 Flutter 2.8 版本中,我們宣佈我們正在努力移除 dev 渠道,簡化你的選擇並減少研發的開銷。在這個版本中,我們已經完成了這項⼯作,包括:
- 更新 Flutter ⼯具以幫助將開發⼈員遷移出開發頻道
- 更新 wiki 對於各個渠道的說明和承諾
- 更新棄⽤政策
- 從 DartPad、預提交測試和⽹站中刪除 dev 渠道的⽀持
Dev 渠道現已被徹底移除。如果我們漏了一些沒有移除的位置,請告訴我們。
對 iOS 9.3.6 的⽀持
由於我們實驗室中⽬標裝置的使⽤減少和維護難度增加,我們正在 調整對於 iOS 9.3.6 的支援,從「⽀持」到「盡力⽽為」。這意味著對 iOS 9.3.6 的⽀持和對 32 位 iOS 裝置的⽀持將僅通過編碼實踐、Ad-Hoc 和社群測試來維持。
我們預計在 2022 年第三季度的 Flutter 穩定版本中放棄對 32 位 iOS 裝置以及 iOS 版本 9 和 10 的 ⽀持。這意味著基於穩定的 Flutter SDK 構建的應⽤程式將不再在 32 位 iOS 裝置上執行,並且 Flutter ⽀持 的最低 iOS 版本將增加到 iOS 11。
重大改動
我們還努力在每個版本和此版本中減少重大改動,儘管我們還沒有完全歸零,但我們會繼續努力。
- Required Kotlin version
- Deprecated API removed after v2.5
- Raw images on Web uses correct origin and colors
- Scribble Text Input Client
如果你仍在使⽤這些 API,可以閱讀 flutter.dev 上的遷移指南。一如既往,⾮常感謝社群貢獻測試,幫助我們識別這些破壞性改動。