咱們很是高興在本週發佈了 Flutter 2。自 Flutter 1.0 發佈至今已有兩年多的時間,在如此短暫的時間內,咱們解決了 24,541 個 issue,合併了來自 765 個貢獻者的 17,039 個 PR。自九月發佈 Flutter 1.22 以來,咱們已解決 5,807 個 issue,合併了來自 298 個貢獻者的 4,091 個 PR。在此特別感謝廣大的貢獻者,將業餘時間慷慨地投入到 Flutter 項目的優化中。Flutter 2 的傑出貢獻者有 xu-baolin (貢獻了 46 個 PR)、a14n (貢獻了 32 個 PR;專一於爲 Flutter 引入空安全) 和 hamdikahloun (貢獻了 20 個 PR;優化了一系列 Flutter 插件)。然而,爲 Flutter 項目作出貢獻的不僅有開發者,還有咱們負責評審 1,525 個 PR 的衆多 PR 評審員,其中包括 hamdikahloun (身兼數職!)、CareF 和 YazeedAlKhalaf (年僅 16 歲!) 等人。Flutter 是真正的社區協力之做,若是沒有問題反饋者、PR 貢獻者和代碼評審員,版本 2 便沒法問世,是大家帶來了這一新版本。html
Flutter 2 的發佈也帶來了許多振奮人心的內容。您能夠閱讀圖文《Flutter 2 正式發佈!》,快速瞭解 Flutter 2 和 Dart 2.12 中的新增功能,以及咱們的客戶及合做夥伴是如何使用 Flutter 2 的。咱們將在下週的圖文中爲你們詳細介紹如何在生產環境中使用 Flutter web 穩定版 併發揮其優點。android
下面咱們一塊兒來詳細瞭解下 Flutter 2 的新增功能吧!ios
從如今開始,Flutter web 的支持已經從 Beta 版過渡到穩定階段。隨着首個穩定版本的發佈,Flutter 經過對 web 平臺的支持,將代碼的複用性提高到了一個新高度。如今,當您平穩運行 Flutter 應用時,能夠將 web 做爲一個新的適配方向。git
做爲一家致力於經過數字化實現卓越運營的現代移動虛擬網絡運營商,Moi Mobiili 選擇使用 Flutter 構建其 Mun Moi 客戶經理應用,並在近期發佈了其 web 版應用。github
藉助 web 平臺的諸多優點,Flutter 爲構建豐富的交互式 web 應用奠基了基礎。咱們的首要重點是提高性能並優化渲染。除了 HTML 渲染引擎外,咱們還新增了一個基於 CanvasKit 的渲染引擎,以及一些如 Link Widget 等特定於 web 的功能,以確保您的應用可以像 web 應用同樣在瀏覽器中穩定運行。web
有關此 Flutter web 穩定版 的更多詳情,請參閱 Flutter web 發佈文章:macos
健全的空安全是對 Dart 語言的重要補充,它經過區分可空類型和不可空類型來進一步增強類型系統。這使開發者可以防止 null error 崩潰,這也是致使應用崩潰的常見緣由。經過將空檢查合併到類型系統中,能夠在開發期間捕獲這些錯誤,從而防止生產環境中的崩潰。在包含 Dart 2.12 的 Flutter 2 中,健全的空安全獲得了充分的支持。要了解更多細節,請參閱 Dart 2.12 發佈文章:編程
pub.dev 已經發布了 超過 1,000 個空安全 package,包括來自 Dart、Flutter、Firebase 和 Material 團隊發佈的數百個 package。若是您也是 package 的做者,請參閱 遷移指南 並着手遷移事項。visual-studio-code
在新版本中,Flutter 對桌面設備的支持已經進入穩定版本的前期準備階段。也就是說,您如今能夠嘗試將其做爲您 Flutter 應用的部署目標: 把它看做最終穩定版發佈前的預覽,最終穩定版本將於今年晚些時候發佈。api
Flutter 桌面版通過一系列大大小小的優化,才達到如今的質量。咱們率先從文本編輯入手,確保其在每一個支持平臺上都能令 文本選擇點 等基本功能得到如原生般的順暢運行體驗,並可以 在鍵盤事件通過處理後將其取消。在鼠標輸入方面,咱們也已確保,當處理觸摸輸入以及在 Material 和 Cupertino 設計語言的 TextField 和 TextFormField 中添加內置上下文菜單,並 在 ReorderableListView 上提供抓取控點 時,使用高精度定點設備的拖放事件將當即開始,沒有任何延遲。另外,內置的上下文菜單已經添加至以 Material 和 Cupertino 爲設計語言的 TextField 及 TextFormField widget 中,ReorderableListView widget 添加了抓取控點功能。
ReorderableListView 現已支持抓取控點,便於鼠標輕鬆拖動
開發者可使用 ReorderableListView 輕鬆移動項目,但用戶須要長按項目以啓用拖動操做。該設計在移動設備上很合理,但不多有桌面平臺的用戶會想到用鼠標長按某個項目來移動它,因此新版本提供了一個適用於鼠標或觸摸輸入的抓取控點。按照一樣的思路,對於因平臺而異的慣用功能,新版本提供了一個 通過升級的滾動條,可以使其與桌面平臺完美適配。
新版本中的滾動條 widget 已適配桌面平臺
更新後的 Scrollbar Widget 爲桌面平臺提供了預期的相同交互功能,例如支持拇指拖動、點擊滾動條空白區域進行上下翻頁,以及將鼠標懸停在滾動條的任何部位以顯示一個軌道等。此外,因爲滾動條能夠經過 新增的 ScrollbarTheme 類設定主題,您能夠根據您的應用對其外觀和感受進行個性化設計。
對於其餘桌面平臺的特定功能,本版本還爲 Flutter 應用啓用了命令行參數處理,這樣一來,您能夠經過在 Windows 文件資源管理器中雙擊鼠標等簡單操做來打開應用中的文件。此外,咱們還努力使 Windows 和 macOS 上的大小調整操做變得更加流暢,並面向全球用戶推出了輸入法 (IME) 支持。
Flutter 桌面現支持輸入法直接輸入
咱們還提供了更新的 文檔,以指導您作好準備,將應用部署到相應的操做系統商店中。您不妨參考一下,如發現有任何遺漏,請反饋給咱們。
試用 Flutter 桌面 Beta 版時,您能夠按需切換到 beta 渠道來進行訪問,並按照 Flutter 文檔上的說明 設置目標平臺的配置標記。此外,咱們還在穩定渠道中新增了 Beta 版的快照。當您使用 "flutter config" 啓用其中一個桌面配置設置 (如 enable-macos-desktop 時),您能夠直接嘗試使用桌面 Beta 版功能,而無需再經歷前往 Beta 渠道、獲取完整的 Beta 版及構建工具等漫長的過程。您不妨親自嘗試一下,或把桌面支持做爲一個簡單的 "Flutter 模擬器",很是好用。
然而,若是您選擇繼續經過穩定渠道使用桌面 Beta 版,那麼您將沒法像切換到 Beta 或開發渠道時那樣快速獲取新功能或錯誤修復,所以,若是您以 Windows、macOS 或 Linux 爲明確目標,咱們建議您切換到更新速度更快的渠道。
在開發穩定版 Flutter 桌面支持過程當中,咱們深知將來還有不少工做要作,包括支持原生頂級菜單集成、提供如同獨立平臺同樣的文本編輯體驗和無障礙功能支持,以及通常漏洞修復和性能加強。若是您認爲桌面平臺在投入生產以前仍然有一些地方須要完善,望 不吝賜教!
如今 Flutter 已可在三個平臺 (Android、iOS 和 web) 上爲生產環境的應用提供支持,還有三個平臺仍處於測試階段 (Windows、macOS 和 Linux),那麼問題來了: 如何開發一款應用,能夠良好適應多種不一樣屏幕規格 (大、中、小屏幕)、不一樣輸入模式 (觸控、鍵盤和鼠標) 和不一樣慣用設備 (移動、web 和桌面)?爲了給本身以及各地的廣大 Flutter 開發者解決這個問題,Flutter Folio 應用應運而生。
您可將 Folio 視做一個簡單的示例應用,幫助您在多個平臺上利用單一代碼庫良好地運行應用。"良好運行" 是指它能在大、中、小屏幕上正常顯示,並能利用觸控、鍵盤和鼠標輸入,還可適應不一樣平臺的風格,例如使用 web 上的連接、使用桌面設備上的菜單等等。咱們將此類應用稱爲 "平臺自適應應用",由於這類應用能良好地適應所運行的任何平臺。
如需查看如何使應用自適應平臺,請參閱 Folio 的源代碼。將來,但願能有更爲深刻地探討此主題的文檔和 codelabs 出現。您還能夠閱讀和觀看 Aloïs Deniel 關於該主題的 博文和視頻。
除了發佈 Flutter 桌面 Beta 版外,咱們也很是高興地發佈了 Google Mobile Ads SDK for Flutter 的公開 Beta 版。這是一個全新插件,除了原有的疊加格式 (疊加橫幅、插頁和激勵視頻廣告),咱們還在其中新增了內聯橫幅及原生廣告。另外,咱們還在此插件中提供了 Ad Manager 和 Admob 支持,不管您是何種規模的發佈商,這款插件都能知足您的需求。
在公開發布 Beta 以前,咱們邀請了一些客戶參與試用這款插件。許多客戶都使用了這些新增的廣告格式成功地發佈了應用。例如,Sua Musica (拉丁美洲最大的獨立藝術家音樂平臺,擁有超過 15,000 位認證音樂人和一千萬活躍用戶) 使用了 Google Mobile Ads SDK for Flutter 插件發佈了新的應用。其廣告展現量增長了 350%,點擊率增長了 43%,千次展現收益上漲了 13%。
您此刻就可以使用該 插件 了。在剛結束的 Flutter Engage 上,Andrew 和 Zoey 圍繞《如何經過 Flutter 應用獲利》介紹了一些 Flutter 應用創收策略,以及如何在 Flutter 應用中加載廣告,您能夠查看下方視頻瞭解詳細內容。此外,咱們在 flutter.dev 上建立了一個新的 Ads 頁面,方便您查找所需資源,如 插件使用指南,內聯橫幅和原生廣告 codelab,以及疊加橫幅,插頁和激勵視頻廣告 codelab,歡迎您隨時查看。更多信息請查看 如何經過 Flutter 應用獲利 視頻。
在不斷提升對其餘平臺支持的同時,咱們並無將 iOS 拋諸腦後。事實上,新版本提供了 178 個與 iOS 相關的合併 PR,其中包括將狀態恢復 (State Restoration) 引入 iOS 的 23495,應開發者需求——不用打開 Xcode 就能夠直接從命令行創建 IPA 的 67781,以及更新 CocoaPods 版本以配合最新工具的 69809。此外,咱們還在 Cupertino 設計語言實現中添加了一些 iOS 小部件。
新增的 CupertinoSearchTextField 爲 iOS 提供了搜索欄 UI。
CupertinoFormSection、CupertinoFormRow 和 CupertinoTextFormFieldRow 等 widgets 則利用 iOS 的視覺美學簡化了驗證表單字段的生成。
除了爲 iOS 新增功能之外,咱們也在持續尋求 iOS 和 Flutter 在着色器和動畫方面的 總體性能優化。iOS 仍然是 Flutter 的首要平臺,咱們將繼續致力於爲你們帶來重要的新功能和性能提高。
新版 Flutter 新增了兩個 Widget,分別是 AutocompleteCore 和 ScaffoldMessenger。AutocompleteCore 是在您的 Flutter 應用中實現自動補全功能所需的基礎功能。
開發者對爲 Flutter 增長 Autocomplete 功能的呼聲很高,因此咱們在新版本中提供了此功能。您如今便可使用,若是您想了解該功能的設計理念,請參閱 設計文檔。
一樣,ScaffoldMessenger 可用於處理許多與消息提示 Snackbar 相關的問題,例如,它能夠輕鬆建立 Snackbar 消息以響應 AppBar 操做、建立可在 Scaffold 轉換之間持久保存的 Snackbar 消息,並可以在異步操做完成時顯示 Snackbar 消息,即便用戶已導航至使用不一樣 Scaffold 的頁面時也不例外。
您只需寫一行代碼,便可將全部這些更加便捷的新功能收入囊中。從如今開始,您可使用此行代碼來顯示您的 Snackbar 消息:
final messenger = ScaffoldMessenger.of(context); messenger.showSnackBar(SnackBar(content: Text(‘I can fly.’)));
如您所想,其中原理不止於此,您能夠觀看 Kate Lovett 發佈的 關於 ScaffoldMessenger 的精彩視頻 瞭解詳情。
在和許多 Flutter 開發者聊天的過程當中,咱們得知大多數人並不是是從零開發一個全新應用,而是會經過將 Flutter 添加到現有的 iOS 和 Android 應用中來進行使用。咱們將此功能稱爲 混合編程 (Add-to-App),您能夠經過這種方法,在保留現有原生代碼庫的同時,在兩個移動平臺間重複使用 Flutter 代碼。然而,咱們有時聽到採用此方法的開發者們表示,他們不知如何擺脫只能將第一個畫面集成到 Flutter 的限制。Flutter 和原生頁面交織致使導航狀態難以維護,並且在視圖級別集成多個 Flutter 會佔用大量內存。
過去,額外 Flutter 實例的內存佔用量與第一個 Flutter 實例相同。在 Flutter 2 中,咱們將建立額外 Flutter 引擎的靜態內存佔用量下降了約 99%,使每一個實例的佔用量大約爲 180kB。
提供該支持的新增 API 目前尚處於預覽狀態,在 咱們的文檔裏,您能夠找到經過使用這種新模式的說明和 示例項目。隨着這一變化的出現,咱們強烈建議您在原生應用中建立多個 Flutter 引擎實例。
當任何成熟的框架彙集了擁有龐大代碼庫的用戶時,咱們每每須要避免對框架 API 進行任何更改,以免破壞日益增多的代碼。隨着超過 50 萬的 Flutter 開發者分佈在愈來愈多的平臺,Flutter 2 很快就會踏入這一行列。然而,隨着時間的推移,爲了持續改進 Flutter,咱們但願可以對 API 進行重大更改。如今的問題是,如何在不影響開發者的前提下繼續改進 Flutter API。
咱們爲此推出了 Flutter Fix。
Flutter Fix 是一系列功能的組合。首先,咱們爲 dart 命令行工具新增了一個名爲 "dart fix" 的命令行選項,您可藉此尋找棄用 API 列表的所在位置,並瞭解如何更新調用這些 API 的代碼。其次,Flutter Fix 自己就是個列表,自版本 2 開始便與 Flutter SDK 綁定。另外,Flutter Fix 也是一組針對 Visual Studio Code、IntelliJ 和 Android Studio IDE 的新 Flutter 擴展程序,您可藉此找到已棄用 API 的相同列表,單擊鼠標,輕點旁邊的小燈泡圖標便可更改代碼,完成快速修復。
舉個例子,好比您的應用具備下面一行代碼:
使用已棄用的函數建立 Flutter widget
由於這個函數已經棄用,請使用下面的參數代替:
替換已棄用的函數並建立 Flutter widget
即便您熟悉和了解不少 Flutter 中已棄用的內容,代碼中須要修改的內容越多,就越難修復全部的內容,也就越容易出現錯誤。人類並不擅長這種重複性的工做,但計算機不同。經過下面的命令,您能夠看到咱們如何在您的整個項目中進行問題修復:
$ dart fix --dry-run
如想批量應用它們,您亦能夠經過如下代碼輕鬆實現:
$ dart fix --apply
或者,若是您但願以交互方式在您喜歡的 IDE 中應用這些修復,也能夠實現。
多年來,咱們一直在標記已棄用的舊 API,如今咱們制定了一個策略,明確 什麼時候真正移除棄用的 API,而咱們率先將其應用到了 Flutter 2 之中。儘管咱們還沒有捕捉到全部棄用 API,並將其以數據形式提供給 Flutter Fix,但咱們會不斷從以前棄用的 API 中獲取更多內容,並在將來持續加入新的重大更改。咱們的目標是盡全力將 Flutter API 打造的盡善盡美,同時保持代碼的及時更新。
爲了明確 DevTools 是用於調試 Flutter 應用的工具,如今咱們已將其命名爲 Flutter DevTools。此外,咱們還作了不少工做,讓其能夠成爲與 Flutter 2 成熟度與質量相匹配的版本。
其中有一個新功能,可在您還沒有啓動 Flutter DevTools 2 時幫您鎖定問題,那就是您的 IDE 可以發現常見的異常,並在 DevTools 中提出這個異常,以助您開展調試。例如,下面顯示您的應用中拋出了一個溢出異常,系統在 Visual Studio Code 中提供了一個在 DevTools 中調試此問題的選項。
Flutter IDE 擴展的溢出異常提示通知
按下該按鈕,您便可利用 DevTools 中的 Flutter Inspector 檢查引起問題的 Widget,以便進行修復。咱們今天的操做只是爲了解決溢出異常,但這種處理方法適用於 DevTools 能夠解決的各類常見異常。
在 DevTools 開始運行後,您可經過標籤上的新錯誤標識幫助本身追蹤應用中出現的具體問題。
DevTools 中的紅點能夠幫助提醒應用中存在的錯誤部分
DevTools 的另外一個新功能是可以輕鬆發現所顯示的分辨率低於其實際分辨率的圖像,這有助於追蹤應用過大和內存佔用過多等狀況。若要啓用此功能,請在 Flutter Inspector 中啓用 Invert Oversized Images。
啓用 "反轉超大尺寸圖像 (Invert Oversized Images)" 選項,以突出顯示異常圖像
如今,當圖像的實際分辨率明顯大於其顯示大小時,系統就會將其倒置,以便您在應用中輕鬆找到它。
"反轉超大圖像" 的操做示例
此外,爲響應大量用戶的要求,除了在 Flutter Inspector 的 Layout Explorer 中顯示有關彈性佈局的詳細信息外,咱們還添加了顯示固定佈局的功能,可便於您調試各類佈局。
新的 Layout Explorer 顯示了 fixed 和 flex layout 的佈局細節
其功能還遠不止如此。如下是對 Flutter DevTools 2 其餘一些新增功能的總結:
固然這並非所有。想了解全部相關更改,建議您查閱下列公告:
咱們也爲 IntelliJ 系列 IDE 的 Flutter 插件添加了一些適用於 Flutter 2 的新功能。首先,咱們在其中新增了一個項目嚮導,該向導與 IntelliJ 中的新嚮導風格一致。
此外,若是您正在 Linux 上使用 IntelliJ 或 Android Studio,針對 安裝自 Snap Store 的 Flutter SDK 進行編程,那麼系統便會將 Flutter snap 路徑添加到已知的 SDK 路徑列表中。這使得 Flutter snap 用戶能夠更輕鬆地在 "Settings (設置)" 中配置 Flutter SDK。感謝 Marcus Tomlinson 對此做出的貢獻!
經過 Snap 安裝 Flutter SDK,能夠更輕鬆的在 Linux 上使用 Android Studio
您能夠從最近更新公告中瞭解更多有用信息:
適用於 Visual Studio Code 的 Flutter 擴展也針對 Flutter 2 進行了優化,咱們首先引入了一些測試加強功能,例如從新運行失敗測試的能力。
通過兩年的逐步發展,對 Dart 的 LSP (語言服務器協議) 支持已經成爲在 Flutter 擴展中將 Dart 分析器集成到 Visual Studio Code 中的默認方式。LSP 支持爲 Flutter 開發帶來了許多改進,包括在當前的 Dart 文件中應用特定的全部修復,以及可以補全代碼以生成完整函數調用 (包括括號和所需參數) 的能力。
LSP 支持不只限於 Dart,它還支持 pubspec.yaml 及 analysis_options.yaml 文件中的代碼補全。
這僅僅是近期 Visual Studio Code 適用於 Flutter 的部分擴展更新。您能夠閱讀下列公告,瞭解所有更新內容:
若是不提 DartPad,那咱們的工具更新就不能算完整,DartPad 現已更新並支持 Flutter 2。
DartPad 已經升級到支持 Flutter 2 了
如今,無需離開喜歡的瀏覽器,您就能夠體驗新的 Flutter 空安全版本。
Flutter 開發體驗不只包括框架和工具;還包括爲 Flutter 應用提供的各類軟件包和插件。自上一次 Flutter 穩定版本發佈以來,這方面也發生了不少變化。例如,咱們已在攝像頭和視頻播放器插件之間合併了將近 30 個 PR,從而大大提升了二者的質量。若是您在過去使用這兩種產品時曾遇到過問題,那麼您應該再嘗試一次,您會發現它們比之前更增強大。
另外,若是您是 Firebase 用戶,我很是高興地宣佈熱門插件的產品質量已經獲得了提升並可投入生產,同時咱們還爲這些插件提供了空安全支持以及針對 Android、iOS、web 和 macOS 的 全套參考文檔和經常使用教程。這些插件包括:
若是您正在尋找應用的崩潰報告,您能夠考慮使用 Sentry,其已經發布了 適用於 Flutter 應用的新 SDK。
Sentry 崩潰報告工具已經支持 Flutter
在 Flutter 應用中使用 Sentry 的 SDK,您能夠在 Android、iOS 或原平生臺上發生錯誤時收到實時通知。查閱 Sentry 文檔 瞭解更多詳細信息。
另外,若是您還沒有了解過 Flutter 社區中的 "Plus" 插件,您也可着手嘗試。Flutter 團隊最初開發的許多熱門插件均由此衍生而來,咱們已在 Plus 插件中添加了空安全支持和對其它平臺的支持,並已着手開始解決 flutter/plugins 庫中的相應問題。這些插件包括:
目前,與 Flutter 兼容的 package 和插件數量超過 15,000 個,這會讓人很難找到那些值得優先考慮的軟件包和插件。所以,咱們發佈了 Pub 分值 (靜態分析評分)、人氣排名、喜好度,若軟件包質量出衆,咱們會爲其打上 "Flutter Favorite" 的特殊標記。爲與 Flutter 2 適配,咱們已在 Favorite 列表中添加了幾個新軟件包:
祝賀這些軟件包的做者!若是您還沒有了解這些軟件包或 列表中的其它軟件包,建議您着手開始瞭解。
最後一樣也是很重要的一點,若是軟件包做者或用戶有興趣瞭解最新版本的軟件包是否適用於最新版本的 Flutter,能夠查看 Codemagic 的新 pub.green 網站以瞭解詳情。
Codemagic 發佈了一個網站 pub.green 用來展現 package 和近期 Flutter 版本的兼容性結果
您可在 pub.green 網站上測試 pub.dev 上可用的 Flutter 和 Dart 軟件與不一樣 Flutter 版本的兼容性。瞭解更多信息,推薦查閱 CodeMagic 團隊的公告博文。
重大變動
咱們爲 Flutter 2 作了以下重大變動,您可利用 "dart fix" 命令自動緩解其中的許多內容:
總結
最後,我想表明 Google Flutter 團隊全體成員向開發者們說一句謝謝!感謝大家在過去的兩年裏推出了超過 15 萬款 Flutter 應用,咱們整理了一些團隊喜歡的 Flutter 應用,在 Flutter Engage 主題演講 上播放了這段視頻,獻給各位開發者和社區。
若是沒有各位開發者們對本身構建的 Flutter 應用的持續支持和熱忱,這個具有全球活力的開發者社區就不可能成爲現實,咱們很是期待看到您接下來的做品!