Flutter 2.2 版已正式發佈!要獲取新版本,您只需切換到 stable 渠道並更新目前安裝的 Flutter,或前往 flutter.cn/docs/get-started 從頭開始安裝。html
雖然與 2.0 版只相隔數月,2.2 版仍是滿載大量改進。此版本共計歸入了框架、引擎和插件庫等方面的 2,456 個 PR 並解決了 3,105 個問題。咱們要特此鳴謝爲此版本貢獻了大量 PR 和 PR review 的整個 Flutter 社區,包括 PR 貢獻最多 (17) 的 Abhishek01039 和 PR review 貢獻最多 (9) 的 xu-baolin。衷心感謝全部開發者對 Flutter 2.2 順利發佈穩定版作出的貢獻。沒有你們的支持,咱們將沒法作到。android
每一個新的 Flutter 穩定版都會帶來諸如性能提高、新功能、bug 修復等一系列變化,並會提供一些還沒有試用於生產環境的試驗性功能,但願您能幫助咱們驗證這些功能可否正常工做並知足您的需求。此外,新版本還會包含一系列相關工具的更新和來自 Flutter 社區的更新。坦白講,現在 Flutter 每一個新版本的內容都很是豐富,不可能在一篇文章中鉅細無遺地詳述,所以下面咱們將着重爲您介紹一些主要亮點。git
此版本在 Flutter 2 的基礎上作了諸多改進,其中不但有面向 Android、iOS 和 web 平臺的更新,還有新的 Material 圖標、文本處理方式的改進、滾動條行爲的變化、TextSpan widget 的鼠標光標支持,以及用一份代碼適配多個平臺方面的新指南。這些功能皆已發佈穩定版,可供您在正式版應用中使用。同時,全部這些功能都是在 新版 Dart 的基礎上構建而成。github
Dart 2.13web
隨 Flutter 2.2 版一塊兒發佈的還有 Dart 2.13 版。此 Dart 版本包含衆多新功能,其中之一是新的類型別名,該功能讓您可爲類型建立別名,就像爲函數建立別名同樣:chrome
// Type alias for functions (existing) typedef ValueChanged<T> = void Function(T value); // Type alias for classes (new!) typedef StringList = List<String>; // Rename classes in a non-breaking way (new!) @Deprecated("Use NewClassName instead") typedef OldClassName<T> = NewClassName<T>;
有了類型別名,您可爲長而複雜的類型賦予簡短易懂的名稱,並以不會破壞代碼的方式重命名您的類。Dart 2.13 版還包含其餘多項更新,您能夠在咱們以前的推文 Dart 2.13 版本發佈 中瞭解詳情。編程
Flutter web 更新canvas
做爲 Flutter 穩定版最新支持的平臺,web 平臺在此版本也有多項改進。windows
首先,咱們藉助新的 service worker 加載機制優化了緩存行爲,並修復了 main.dart.js
的重複下載問題。在舊版 Flutter web 中,service worker 會在後臺下載應用更新,用戶在此期間可照常使用應用的舊版本。更新下載完畢後,用戶要屢次刷新瀏覽器頁面後纔會看到相應更新。在 Flutter 2.2 版中,當新的 service worker 檢測到更新後,用戶須要先等待更新下載完畢才能使用應用,但屆時他們無需再次手動刷新頁面便可看到更新內容。後端
要啓用此項變動,您須要從新生成您的 Flutter 應用的 index.html
。具體來講,請保存您的修改、刪除 index.html
文件,而後在項目目錄中運行 flutter create
. 以從新生成該文件。
咱們還對兩個 web 渲染器都作了改進。在 HTML 渲染器上,咱們添加了對 字體特性 的支持,以啓用 FontFeature
設置並使用 canvas API 渲染文本,從而使鼠標懸停處的文本可以顯示在適當的位置。在 HTML 和 CanvasKit 渲染器上,咱們新增了對着色器遮罩 (shader masks) 和 computeLineMetrics
的支持,以解決 Flutter web 應用和移動應用二者不一致的問題。例如,開發者如今能夠經過 不透明度遮罩 使用着色器遮罩實現淡出轉場,並像在移動應用中同樣使用 computeLineMetrics
。
無障礙功能不可是 Flutter web 的一大重點,也是整個 Flutter 的一個重心所在。按照設計,是經過構建 SemanticsNode
樹來實現無障礙功能。Flutter web 應用的用戶啓用無障礙功能後,咱們會生成一個與 RenderObject
DOM 樹並行的 DOM 樹,並將語義屬性轉換爲 Aira。在此版本中,咱們改進了語義節點位置,消除了移動應用和 web 應用在使用轉換 (transform) 時的不一致,這意味着在使用轉換對 widget 進行樣式設置時,焦點框會正確地顯示在元素上方。如需直觀瞭解其實際效果,您能夠觀看 Material Design 無障礙項目負責人 Victor Tsaran 的視頻,瞭解他如何對 Flutter Gallery App 使用 VoiceOver。
咱們如今還提供一個適用於性能分析 (profile) 和發佈 (release) 模式的命令行 flag,以供開發者訪問語義節點調試樹,並直觀查看系統爲其 web 應用建立的語義節點,從而對應用的無障礙功能進行調試。
要爲您的 Flutter web 應用啓用此功能,請運行如下命令:
$ flutter run -d chrome --profile \ --dart-define=FLUTTER_WEB_DEBUG_SHOW_SEMANTICS=true
激活該 flag 後,您將可以在各個 widget 上方看到您的語義節點,從而進行調試並檢查語義元素的位置是否符合預期。若是您發現這類問題,歡迎向咱們 提交 bug 報告。
雖然在覈心無障礙功能的支持方面已經取得了長足進步,但咱們仍在這個領域不斷改進。在 2.2 穩定版 以後的 master 和 dev 渠道 build 中,咱們新增了一個 API,供開發者以編程方式爲其應用 自動啓用無障礙功能,同時咱們正在着手解決 在屏幕閱讀器中使用 Tab 鍵 的問題。
最後但也一樣重要的是,最新版的 Flutter DevTools 如今還支持爲您的 Flutter web 應用使用佈局瀏覽器。
您如今能夠在 web 應用中使用您所熟悉的佈局調試工具,這與移動應用和桌面應用別無二致。
iOS 頁面轉場和增量式安裝
對於 iOS 平臺,此版本將動畫幀的渲染時間縮減了 75%,使 Cupertino 主題中頁面轉場更流暢。在低端手機上的縮減比例甚至可能更高。咱們不只改善了最終用戶可感知到的性能,還一直在千方百計提高開發性能。
在此版本中,咱們實現了開發過程當中的 增量式 iOS 安裝。基準測試結果顯示,iOS 應用的更新版本安裝時間縮短了 40%,這也就縮短了您的應用變動測試周期。
使用 Flutter 構建平臺自適應應用
隨着 Flutter 穩定版逐步支持更多平臺,您在設計應用時不只須要考慮兼容不一樣的設備類型 (如手機、平板電腦和桌面電腦),還須要考慮支持不一樣的輸入方式 (觸摸與鍵鼠),以及適配各個平臺上的不一樣使用習慣 (例如在導航時是使用抽屜式導航欄仍是系統菜單)。若是應用可以根據不一樣目標平臺的細節差別作出相應調整,咱們就稱之爲平臺自適應應用。
若是您想初步瞭解在構建平臺自適應應用時要考慮哪些因素,請觀看 Kevin Moore 關於 "構建平臺自適應應用" 的視頻。如需詳細瞭解,您能夠閱讀 Flutter 文檔中關於平臺自適應應用的指南。
最後,如需參考遵循這些指南編寫出的多平臺應用示例。咱們建議您看看 gSkinner 打造的 Flokk 和 Flutter Folio 應用。您既能夠下載 Flokk 和 Folio 的源代碼,也能夠從各個應用商店下載 Flokk 和 Folio 應用,還能夠直接在瀏覽器中運行它們。另外一個優秀示例是 用於建立指南自己的應用。
Flutter 平臺自適應應用指南的 UX 部分以新的 Material 大屏幕指南 爲基礎。Material 團隊在新發布的這一指南中,根據大屏幕的特性,修訂了多篇主要的佈局文章,調整了多個組件,並更新了 Design Kit。
Flutter 的目標始終是讓應用能夠走得更高更遠,而不只是可以在多個平臺上正常運行。不作到讓您的應用可以良好適配全部目標平臺,咱們不會停下腳步。Flutter 可以爲您提供所需支持,讓您的應用不但可以覆蓋多個目標平臺,並且可以針對不一樣的屏幕尺寸、輸入方式以及各平臺的不一樣使用習慣而作出適當的調整。
提及 Material 指南,此版本還歸入了兩個獨立的 PR,向 Flutter 中添加了更多 Material 圖標。咱們可愛的吉祥物 Dash 如今也有專屬的圖標了!
加上這些新圖標,可供您的應用使用的 Material 圖標總數現已突破 7,000 大關。若是您在這海量圖標中尋找所需圖標時遇到了困難,能夠訪問 fonts.google.com/icons,按類別和名稱來搜索圖標。
找到理想的圖標後,您能夠在新的 "Flutter" 標籤頁中查看有關如何使用該圖標的說明。您也能夠單獨下載這個圖標,將其用做應用中的獨立資源。在您的 Flutter 應用中加入 Dash 的可愛形象從未如此簡單。
經過名稱搜索 Material 圖標
改進文本處理方式
隨着咱們持續改進 Flutter 以使其可以更好地適配各個平臺的具體特性,咱們正逐步涉足一些在移動設備上不突出但在桌面設備上很重要的新領域,其中之一就是文本處理。在此版本中,咱們着手對文本輸入的處理方式進行重構,以實現下述功能: 在按鍵事件於 widget 層次結構內傳播的過程當中將其取消,以及可以徹底自定義與文本操做相關聯的按鍵。
因爲如今可以取消按鍵事件,Flutter 按下空格鍵和箭頭鍵時不會再觸發滾動事件,從而讓用戶獲享更直觀的體驗。您還可使用此功能來實如今一個按鍵事件傳播到您應用中的父級 widget 以前對其進行處理。另外一個例子是,您能夠在您的 Flutter 應用中實現用 Tab 鍵在 TextField 和按鈕之間跳轉,一切均可按預期正常運做:
import 'package:flutter/material.dart'; void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) => MaterialApp( title: 'Flutter Text Editing Fun', home: HomePage(), ); } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) => Scaffold( body: Column( children: [ TextField(), OutlinedButton(onPressed: () {}, child: const Text('Press Me')), ], ), ); }
Flutter 2.2 可在按鍵事件於 widget 層次結構內向上傳播的過程當中將其取消;例如,您能夠將 TAB 鍵用於將焦點從 TextField 切換到其餘元素
自定義文本操做讓您能夠實現對 TextField 中的 Enter 按鍵事件進行特殊處理,例如,使 Enter 鍵在聊天客戶端中觸發消息發送操做,同時讓用戶能夠按 Ctrl+Enter 鍵來換行。此類文本操做 讓 Flutter 自己也可以提供不一樣的按鍵設置,從而使文本編輯行爲與主機操做系統相一致,例如在 Windows 和 Linux 上使用 Ctrl+C 複製文本,而在 macOS 上使用 Cmd+C。
下面就是一個這樣的例子,它覆蓋了默認的向左箭頭按鍵操做,併爲退格鍵和刪除鍵設置了新的操做:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) => MaterialApp( title: 'Flutter TextField Key Binding Demo', home: Scaffold(body: UnforgivingTextField()), ); } /// A text field that clears itself if the user tries to back up or correct /// something. class UnforgivingTextField extends StatefulWidget { @override State<UnforgivingTextField> createState() => _UnforgivingTextFieldState(); } class _UnforgivingTextFieldState extends State<UnforgivingTextField> { // The text editing controller used to clear the text field. late TextEditingController controller; @override void initState() { super.initState(); controller = TextEditingController(); } @override Widget build(BuildContext context) => Shortcuts( shortcuts: <LogicalKeySet, Intent>{ // This overrides the left arrow key binding that the text field normally // has in order to move the cursor back by a character. The default is // created by the MaterialApp, which has a DefaultTextEditingShortcuts // widget in it. LogicalKeySet(LogicalKeyboardKey.arrowLeft): const ClearIntent(), // This binds the delete and backspace keys to also clear the text field. // You can bind any key, not just those already bound in // DefaultTextEditingShortcuts. LogicalKeySet(LogicalKeyboardKey.delete): const ClearIntent(), LogicalKeySet(LogicalKeyboardKey.backspace): const ClearIntent(), }, child: Actions( actions: <Type, Action<Intent>>{ // This binds the intent that indicates clearing a text field to the // action that does the clearing. ClearIntent: ClearAction(controller: controller), }, child: Center(child: TextField(controller: controller)), ), ); } /// An intent that is bound to ClearAction. class ClearIntent extends Intent { const ClearIntent(); } /// An action that is bound to ClearIntent that clears the TextEditingController /// passed to it. class ClearAction extends Action<ClearIntent> { ClearAction({required this.controller}); final TextEditingController controller; @override Object? invoke(covariant ClearIntent intent) { controller.clear(); } }
一個糟糕的 TextField 示例,按下左箭頭鍵或 ESC 鍵會清除文本
在這方面,咱們的確還有不少工做要作,但咱們將竭盡全力賦予開發者對文本編輯操做的徹底控制權。目標是在 Flutter 桌面版達到穩定時,最終用戶將沒法區分 Flutter 應用中的文本編輯功能與主機操做系統中的其餘應用有什麼差異。
自動滾動行爲
咱們一直致力於讓 Flutter 應用的表現與各個平臺上最優秀的應用一模一樣,爲此,咱們在這個版本中對滾動條又作了進一步優化。在滾動條的顯示方式上,Android 和 iOS 將徹底相同,即默認不顯示滾動條。但在桌面應用中,只要內容大於容器,一般就會自動顯示滾動條。這就要求您添加一個類型爲 Scrollbar
的父級 widget。爲了在移動設備和桌面設備上都實現正確的行爲,此版本會在須要時自動添加一個 Scrollbar
。
如下是一段不含 Scrollbar 的代碼:
import 'package:flutter/material.dart'; void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) => MaterialApp( title: 'Automatic Scrollbars', home: HomePage(), ); } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) => Scaffold( body: ListView.builder( itemCount: 100, itemBuilder: (context, index) => Text('Item $index'), ), ); }
上述代碼在桌面平臺上運行時,將會顯示一個滾動條:
若是您不喜歡滾動條的外觀或不想讓滾動條一直顯示,能夠設置 ScrollBarTheme
。若是您不喜歡該默認行爲,能夠在應用層級或具體實例層級經過設置 ScrollBehavior
來對其進行更改。如需詳細瞭解新的默認滾動條行爲以及如何遷移代碼以遵循新的最佳實踐,請參閱 Flutter 官方文檔。
TextSpan 上的鼠標指針
在以前的 Flutter 版本中,您能夠在任何 widget 上添加一個鼠標指針 (例如用手型指針來表示元素可供點擊)。實際上,Flutter 會在大部分狀況下替您添加此類鼠標指針,例如在全部按鈕上添加手型鼠標指針。不過,若是您是用多個不一樣樣式的 TextSpan 來實現一段富文本,並且其長度可能長到須要換行,那就沒辦法給它添加鼠標指針了,這是由於 TextSpan
不屬於 widget
,不能用於界定鼠標指針的視效範圍。但如今不同了!在新版本中,若是您的 TextSpan
具有手勢識別器 (GestureRecognizer),系統將自動爲其設置鼠標指針:
import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart' as urlLauncher; void main() => runApp(App()); class App extends StatelessWidget { static const title = 'Flutter App'; @override Widget build(BuildContext context) => MaterialApp( title: title, home: HomePage(), ); } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) => Scaffold( appBar: AppBar(title: Text(App.title)), body: Center( child: RichText( text: TextSpan( style: TextStyle(fontSize: 48), children: [ TextSpan( text: 'This is not a link, ', style: TextStyle(color: Colors.black), ), TextSpan( text: 'but this is', style: TextStyle(color: Colors.blue), recognizer: TapGestureRecognizer() ..onTap = () { urlLauncher.launch('https://flutter.dev'); }, ), ], ), ), ), ); }
如今您能夠自由使用任意換行的 TextSpan,只要其具有手勢識別器,系統即會爲其設置適當的鼠標指針。
在此版本中,TextSpan
除了支持 mouseCursor
,還支持 onEnter
和 onExit
。這些改進看似細小,對用戶體驗的影響卻大,能讓 Flutter 應用提供更貼近用戶預期的使用體驗。
除了適用於生產環境的新功能,Flutter 2.2 還搭載了多項新的預覽版功能,包括 iOS 着色器編譯性能改進、Android 延遲加載組件支持、Flutter 桌面平臺更新以及 Sony 貢獻的 ARM64 Linux 主機支持。歡迎您體驗這些功能,並 在遇到問題時向咱們報告。
iOS 着色器編譯改進
在圖形渲染領域,"着色器" 指的是一個在終端用戶設備可用的 GPU 上編譯並運行的程序。Flutter 自誕生伊始就在底層的 Skia 圖形庫中使用着色器,從而在色彩、陰影、動畫等方面實現高質量圖形效果的同時達成可媲美原生代碼的優越性能。得益於 Flutter API 的靈活性,着色器可以以 JIT 方式即時生成和編譯,並與須要它們的幀工做負載同步。不過,當着色器的編譯耗時超出相應幀的時間預算,就會致使用戶感覺到卡頓。
爲了不這類卡頓,Flutter 讓您能夠在訓練運行期間緩存着色器,並將其打包到應用中,而後於 Flutter 引擎啓動時的第一幀以前對其進行編譯。這樣一來,這些預先編譯的着色器就沒必要在幀工做負載期間進行編譯,也就不會形成卡頓。不過,Skia 一開始只針對 OpenGL 實現了此功能。
這就致使,咱們因 Apple 廢棄 OpenGL 而在 iOS 上默認啓用 Metal 後端後,基準測試測得的最差幀時間數值有所增加,用戶報告卡頓的狀況也有所增多。通過調查,咱們發現此類卡頓每每由下列因素形成: 着色器編譯時間增長、Skia 爲 Metal 後端生成的着色器數量增多,以及未能在屢次運行之間對編譯後的着色器進行緩存並於是致使應用在後續運行時仍然出現卡頓。
到目前爲止,在 iOS 上杜絕此類卡頓的惟一方式就是對場景和動畫進行簡化,而這不是一個理想的解決方案。
爲解決這個問題,咱們已在 dev 渠道中發佈 Skia 針對 Metal 新增對着色器預熱的支持 這一預覽版功能。Flutter 如今會經過 Skia 在第一個幀工做負載開始以前對捆綁的着色器進行編譯。
應用啓動期間的預編譯操做的跟蹤記錄
不過,此解決方案存在一些不足之處:
若是您但願在本身的應用中使用此新功能,能夠參考 Flutter 官方文檔 上的說明進行操做。
咱們將持續改進此實現方案。在 Android 和 iOS 上,它目前有幾個缺點:
其中,咱們最爲重視最後一點。咱們認爲開發者不該該須要執行訓練運行,也不該該在應用體積和啓動延時方面承擔代價。所以,咱們還在繼續探索是否有不依賴此實現方案的其餘方法來消除着色器編譯卡頓以及其餘類型的卡頓。咱們正在與 Skia 團隊攜手合做,下降 Flutter 請求產生的着色器數量,並探討在 Flutter 引擎中捆綁少許靜態定義的着色器的可行性。
您能夠關注 Flutter 代碼庫中的相關項目 瞭解相關進展。
Android 延遲加載組件: 可下載的 AOT 代碼和資源
在 Android 平臺上,此版本利用 Dart 的分拆式 AOT 編譯功能來 讓 Flutter 應用可以在運行時下載內含預先編譯的代碼和資源的模塊。咱們將這種可安裝的分拆模塊稱爲 "延遲加載組件"。因爲可在須要時才下載代碼和資源,應用的初始安裝體積顯著縮小。例如,咱們實現了一個特殊版本的 Flutter Gallery 應用,將其中全部案例和 demo 都設爲延遲加載,從而將初始安裝體積縮減了 46%。
在 Flutter Gallery 應用中下載 Crane 案例
若是在構建應用時啓用延遲加載組件,Dart 會將那些單獨用 deferred
關鍵字導入的代碼編譯到獨立的共享庫中,並將這些庫與相關資源一塊兒打包爲延遲加載組件。
該功能還處於早期預覽階段,目前只支持 Android。您能夠在 Flutter 官方文檔上新的 延遲加載組件 頁面中瞭解如何實現此類組件。此頁面還連接到了 Flutter wiki 上的一個頁面,後者詳細介紹了此功能的工做原理。若是發現問題,請經過 Flutter 問題跟蹤器 告知咱們。
Flutter Windows UWP alpha 版
此版本 Flutter 的另外一項更新針對的是桌面平臺: 對 Windows UWP 的支持現已在 dev 渠道中進入 alpha 版階段 (2.2 穩定版以後)。藉助 UWP,您的 Flutter 應用將能夠覆蓋 Xbox 等沒法運行標準 Windows 應用的設備。如需試用此功能,請先 知足 UWP 前置條件,而後切換到 dev 渠道並啓用 UWP 支持。
$ flutter channel dev $ flutter upgrade $ flutter config — enable-windows-uwp-desktop
啓用後,建立的 Flutter 應用會包含一個新的 winuwp
文件夾,以便您在 UWP 容器中構建和運行您的應用:
$ flutter create uwp_fun $ cd uwp_fun $ flutter pub get $ flutter run -d winuwp
因爲構建的是在 Windows 沙盒環境中運行的 Windows UWP 應用,您須要在開發期間對應用的防火牆進行 localhost 穿透設置,以實現熱重載和調試器斷點等功能。爲此,您能夠按照 Flutter 桌面文檔頁面 上的說明使用 checknetisolation 進行操做。完成相關操做後,您就能夠在 Windows 上以 UWP 應用的形式運行您喜好的 Flutter 應用了。
在 Windows UWP 容器中運行您喜好的 Flutter 應用
固然,您也能夠運行一些更豐富有趣的 UWP 應用,例以下面這個 視頻 中在 Xbox 上運行的 Flutter 應用。
在 Xbox 上運行的 Flutter 應用
咱們要特此致謝 clarkezone,從我加入 Flutter 團隊時起,他就一直投身於實現這項功能。如需詳細瞭解 Windows UWP alpha 版支持,請參閱 官方文檔。
Sony 貢獻的 ARM64 Linux 主機支持
這項傑出貢獻來自於 Flutter 社區的 Sony 軟件工程師 HidenoriMatsubayashi。他提交的 ARM64 Linux 目標支持 這條 PR 讓您能夠在 ARM64 Linux 機器上構建和運行 Flutter 應用。
在 ARM64 Linux 機器上運行您喜好的 Flutter 應用
咱們很高興看到 Flutter 社區將 Flutter 移植到超乎 Google 團隊想象的平臺。HidenoriMatsubayashi,感激涕零!
Flutter 引擎和框架只是總體體驗的一部分,package 生態系統和工具方面的更新對 Flutter 開發者的體驗來講一樣重要。咱們在這個領域也有幾項很棒的更新與您分享。
在生態系統端,咱們發佈了多個 Flutter Favorite package,並更新了 Flutter 的 Firebase 支持插件集 FlutterFire。FlutterFire 如今還支持新的 Firebase App Check 預覽版,讓 Flutter 開發者自第一天起就可受益於這個產品。
在工具端,Flutter DevTools 作了多項更新以方便您優化應用的內存使用方式,還爲 Provider package 提供了一個標籤頁。適用於 VS Code 和 Android Studio/IntelliJ 的 IDE 插件也有重大更新。此外,若是您是 Flutter 相關內容的創做者,咱們還提供了一種全新方式讓您將 DartPad 集成到您的創做流程中。
最後,Flutter 如今有了一個新的低代碼 (low-code) 應用設計和構建工具,名爲 FlutterFlow。該工具在 web 上運行,自己也是使用 Flutter 構建而成。
Flutter Favorite 更新
在此版本中,得益於 Flutter 生態系統委員會 (FEC) 的辛勤工做,咱們增長了 24 個 Flutter Favorite 認證 package,堪稱有史以來步伐最大的一次擴張。這些新出爐的 Flutter Favorites package 包括:
cloud_firestore
、cloud_functions
、firebase_auth
、firebase_core
、firebase_crashlytics
、firebase_messaging
和 firebase_storage
android_alarm_manager_plus
、android_intent_plus
、battery_plus
、connectivity_plus
、device_info_plus
、network_info_plus
、package_info_plus
、sensors_plus
和 share_plus
全部這些 package 都已支持空 (null) 安全特性,並儘量支持 Android、iOS 和 web 平臺。其中有一些例外,例如 firebase_crashlytics
沒有適用於 web 平臺的底層 SDK,而 android_alarm_manager_plus
則是專爲 Android 平臺設計。
Flutter Community "plus" package 在 Flutter 團隊官方 package 的基礎上提供了更多特性。例如,Google 的 Flutter 團隊提供的 battery package 能夠追溯到第一版 Flutter 發佈以前,它如今具有空安全特性,但只支持 Android 和 iOS 平臺。與此相對,Flutter Community battery_plus package 則支持所有 6 個 Flutter 平臺,包括 web、Windows、macOS 和 Linux。該套件內置的所有 9 個 "plus" package 都得到了 Flutter Favorite 承認,這是標誌着整個 Flutter 社區邁向成熟的重大一步。Flutter 項目已經遠遠不止是 Google 工程團隊獨力奮戰。您應儘快將您的代碼遷移至 "plus" package。在將來幾週中,Google 的相關 package 將會更新,建議您進行遷移。
googleapis 插件爲 185 個 Google API 提供了自動生成的 Dart 封裝,供您在客戶端或服務器端的 Dart 應用 (包括您的 Flutter 應用) 中使用。如需進一步瞭解此 package,您能夠觀看其做者關於使用 Google API 爲您的 Flutter 應用賦能的 I/O 大會演講。
win32 package 堪稱一件工程傑做,它使用 Dart FFI 封裝了大部分經常使用 Win32 API 接口,讓 Dart 代碼無需依賴 C 編譯器或 Windows SDK 便可使用這些 API。隨着 Flutter 在 Windows 平臺上愈來愈受關注,win32 package 成爲了許多熱門插件的關鍵依賴項,其中包括最熱門 Flutter package 之一的 path_provider。爲了挑戰極限,其做者 timsneath 創下了一些驚人壯舉,例如使用純 Win32 和純 Dart 來實現 notepad (記事本)、snake (貪吃蛇) 和 tetris (俄羅斯方塊)。
僅使用 Dart FFI 和 Win32 接口實現的在 Windows 平臺運行的俄羅斯方塊遊戲
若是您有在 Windows 上進行任何 Dart 或 Flutter 開發,win32 package 值得您一探究竟。
FlutterFire 更新和 Firebase App Check
做爲 Flutter 的 Firebase 支持插件集,FlutterFire 已躋身最熱門 Flutter 插件之列。爲了讓該插件集的正式版可以與 Flutter 2 一道發佈並在隨後對其持續進行改進,其主要貢獻者 Invertase 團隊作了許多出色的工做。自 FlutterFire 的首個正式版發佈以後,Invertase 將未解決問題的數量下降了 79%,並將待處理 PR 的數量下降了 88%。他們不只在正式版插件的開發上成績斐然,還成功將全部 Beta 版插件都支持了空安全機制,同時讓這些插件在您可能遇到的各類核心上都能正常構建和運行。
Invertase 還在繼續爲 FlutterFire 插件增添更多功能,包括在新版 Flutter 中對 Cloud Firebase 集成作的多項更新:
FlutterFire 如今還支持 Firebase 新推出的 beta 版產品 Firebase App Check。Firebase App Check 可幫助您保護 Cloud Storage 等後端資源,使其不受付費欺詐或釣魚攻擊等濫用行爲的侵害。有了 App Check,運行您的 Flutter 應用的設備會經過一個應用身份證實提供方來證實應用實例的正當身份,並可檢查應用是否運行在未受篡改的可信設備上。一旦您啓用 App Check,相應證實信息會附加到您的應用向 Firebase 後端資源發出的每個請求中。要了解詳情,請參閱 FlutterFire App Check 文檔。
Flutter DevTools 更新
此版本的 Flutter DevTools 帶來了多項重大更新,包括內存跟蹤方面的兩項改進和一個 Provider 插件專屬的新標籤頁。
內存跟蹤方面的第一項改進: 跟蹤對象的內存分配位置。這有助於找出致使內存泄漏的代碼。
Flutter DevTools 內存標籤頁分配棧軌跡
第二項改進: 向內存時間軸中注入自定義信息。這讓您能夠根據應用的具體狀況添加標註,例如標出內存密集型工做的開始點和結束點,以驗證是否適當地執行了清理。
Flutter DevTools 時間軸標籤頁自定義內存事件
隨着 Flutter 應用的體積逐步增加,咱們將繼續努力爲 Flutter 開發者提供所需的工具,助其跟蹤和修復內存泄漏和其餘各類運行時問題。
您須要排查的問題並不只僅是那些與 Flutter 框架相關的運行時問題,有時還有與所依賴 package 相關的問題。隨着 pub.dev 上的 Flutter 兼容 package 數量突破 15,000 大關,您的應用使用的 package 數量也極可能隨之增加。有鑑於此,Flutter DevTools 中新加入了一個實驗性的 Provider 標籤頁,由 provider package 自己及其餘不少出色軟件的開發者 Remi Roussel 傾力打造。若是您運行的是最新版 Flutter,在您對一個包含 provider 插件的 Flutter 應用進行調試時,Provider 標籤頁就會自動顯示。
實戰演示: Flutter DevTools Provider 標籤頁
Provider 標籤頁會向您展現每一個 provider 的相關數據,並會實時反映您在應用運行過程當中作出的更改。很棒吧?不只如此,它還可讓您直接更改這些數據,從而對應用的邊角案例進行測試。太讚了!
在合力 Remi 開發此標籤頁的過程當中,咱們也學到了一些寶貴經驗,知道了該如何更好地爲具備相似需求的 package 做者服務。您能夠了解 Remi 是如何構建出 Provider 標籤頁的,還能夠經過 Flutter DevTools 插件提案瞭解咱們當前的改進思路。歡迎向咱們提供反饋;同時,若是您在 Flutter DevTools 新增更多標籤頁方面也有本身的想法,咱們也很期待聽到您的高見。
上述改進只是此版本 Flutter DevTools 衆多改進中的幾項。如需完整列表,請查看下列公告:
IDE 插件更新
在此版本中,針對 Flutter 的 Visual Studio Code 和 IntelliJ/Android Studio IDE 擴展也獲得了更新。例如,Visual Studio Code 擴展示在支持兩項額外的 Dart 代碼重構: 內聯函數和內聯本地變量。
實戰演示: 新的 "內聯函數" Dart 重構
在 Android Studio/IntelliJ 擴展中,咱們新增了一個在控制檯中輸出全部堆棧軌跡的選項。
您如今能夠輸出全部堆棧軌跡,而不只限於第一條
若是項目中某個問題的根源是在另外一個 package,之前相關軌跡不會歸入到輸出中,這項新功能就能夠派上大用場。但隨之而來的一個問題是,該如何讓軌跡信息更易於梳理解讀?咱們已經有了一些想法,歡迎關注後續相關改動。
如需此版本中 IDE 擴展的完整變動列表,請查看下列公告:
DartPad 隨堂實踐
爲了確保 Flutter 開發者社區蓬勃發展的同時讓相關文檔也能跟上腳步,Dart 和 Flutter 團隊始終在千方百計改進和拓展相關培訓內容的製做方法。在此版本中,咱們爲 DartPad 添加了一個新的分步式界面,讓開發者在學習講師主導的課程/講座時能夠方便地隨堂動手實踐。
實戰演示: DartPad 課程/講座隨堂實踐
經過將實踐指引直接加入到 DartPad 中,咱們在今年的 I/O 大會實現了 引導式講座體驗。不過,此功能並不是專爲咱們本身的需求而開發,若是您要在本身的 Dart 或 Flutter 課程/講座中使用該工具,能夠按 DartPad 培訓內容創做指南 中的說明操做。請勿將此功能與 在 Gist 中經過 DartPad 分享代碼 和 在您的網站上嵌入 DartPad 這兩項功能相混淆,後二者已經推出了一段時間。
咱們但願全部 Dart 和 Flutter 內容做者都可以爲其受衆帶去豐富的互動式體驗。歡迎試用並 向咱們提供反饋。
社區聚焦: FlutterFlow
FlutterFlow 是一個 "低代碼" (low code) 應用設計和開發工具,用於在瀏覽器中構建應用。它提供了一個 "所見即所得" 環境,讓您可根據實際 Firebase 數據來設計橫跨多個頁面的應用佈局。此工具的目標是讓您可以輕鬆執行大部分常見操做,並儘可能減小您本身須要編寫的代碼量。實際上,在一次演示中,演示者不到一個小時就使用此工具構建出了一個包含多個頁面、可幫助用戶遊覽大都會藝術博物館的完整移動應用,整個過程沒有寫一行代碼。您能夠在 YouTube 上觀看整個過程的 視頻記錄。
一如既往,咱們會盡可能避免進行影響兼容性的重大變動。在此版本中,此類變動僅限於移除下面這些已廢棄的組件:
您能夠 在 flutter.cn 上找到這些變動對應的遷移指南.
Google Flutter 團隊全體同仁謹此向你們致以誠摯謝意!咱們要感謝 Flutter 社區的每個人,Flutter 取得的成績離不開你們的每一份貢獻。現在,Play 商店中有超過八分之一的新應用是採用 Flutter 構建而成,僅在 Play 商店就收錄了多達 20 萬款 Flutter 應用。Flutter 的迅猛發展勢頭出人意表。世界各地大大小小的應用團隊都使用 Flutter 進行開發,爲諸多平臺上的用戶打造優質體驗。謝謝你們選擇 Flutter!
最後,以避免您錯過,不要忘了體驗下在本次 I/O 大會推出的 I/O Photo Booth web 應用,它是由 Flutter 和 Firebase 構建而成的 web 應用,讓您能夠和 Dash 合拍萌萌的大頭照。咱們還 開放了其源代碼,方便您進一步瞭解 Flutter web 最佳實踐、相機插件 web 支持以及如何使用 Cloud Functions 函數來生成自定義社交內容。機不可失,趕忙一睹爲快吧!