原文鏈接:https://medium.com/flutter/whats-new-in-flutter-2-8-d085b763d181
歡迎來到 Flutter 2.8!該版本包含了 207 位 contributors 和 178 位 reviewers 的內(nèi)容,其中一共有 2,424 個(gè)合并的 PR,并 Closed 了 2976 個(gè)問題。
與往常一樣,F(xiàn)lutter 的工作的第一位就是保證質(zhì)量,我們花費(fèi)了大量時(shí)間來確保 Flutter 在支持的設(shè)備范圍內(nèi)可以盡可能平穩(wěn)和穩(wěn)健地運(yùn)行。
Startup
該版本改進(jìn)了應(yīng)用的啟動(dòng)延遲問題,這個(gè)改進(jìn)在 Google Pay 中進(jìn)行了, Google Pay 作為一個(gè)主流的大型應(yīng)用程序,代碼超過 100 萬行,使用它進(jìn)行測(cè)試可以確保這些更改所產(chǎn)生的影響是可以被感知的。
所有這些改進(jìn)使得 Google Pay 在低端 Android 設(shè)備上運(yùn)行時(shí)的啟動(dòng)延遲降低了 50%,在高端設(shè)備上降低了 10%。
Flutter 通過影響 Dart VM 的垃圾收集策略的方式,可以有助于避免在應(yīng)用啟動(dòng)期間出現(xiàn)不合時(shí)宜的 GC 。
例如在 Android 上渲染第一幀之前,F(xiàn)lutter 現(xiàn)在 只通知 Dart VM
TRIM_LEVEL_RUNNING_CRITICAL及以上的內(nèi)存壓力信號(hào),在本地測(cè)試中,這個(gè)更改將低端設(shè)備上的第一幀時(shí)間減少了多達(dá) 300 毫秒。
出于嚴(yán)謹(jǐn)?shù)目紤],在之前的版本中 Flutter 創(chuàng)建平臺(tái)視圖時(shí)會(huì)阻塞平臺(tái)線程,這次通過詳細(xì)的推理和測(cè)試 確定了可以刪除一些序列化,這個(gè)改進(jìn)消除了在低端設(shè)備上啟動(dòng) Google Pay 期間超過 100 毫秒的阻塞。
另外,以前設(shè)置默認(rèn)字體管理器時(shí),會(huì)在設(shè)置第一個(gè) Dart isolate 時(shí)添加人為的延遲,而延遲默認(rèn)字體管理器 和 Dart Isolate 設(shè)置,這樣既改善了啟動(dòng)延遲,又使上述優(yōu)化的效果更加明顯。
Memory
由于 Flutter 頻繁地加載 Dart VM 的 “service isolate”,這部分 AOT 代碼與應(yīng)用程序捆綁在一起,因此 Flutter 會(huì)同時(shí)將這兩者都讀入內(nèi)存,因此針對(duì)內(nèi)存受限的設(shè)備, Flutter 開發(fā)人員在進(jìn)行性能跟蹤時(shí)遇到了問題。
在 2.8 版本中針對(duì) Android 設(shè)備, Dart VM 的 service isolate 被拆分為可以單獨(dú)加載的自己的包,這樣的調(diào)整讓設(shè)備可節(jié)省最多 40 MB 的內(nèi)存。
通過 Dart VM informing the OS ,內(nèi)存占用進(jìn)一步減少了 10% ,AOT 程序使用的內(nèi)存將可能不需要再次讀取文件,因此,之前保存文件備份數(shù)據(jù)副本的頁面可以被回收并用于其他用途。
Profiling
以便更好地了解應(yīng)用程序中的性能問題,在應(yīng)用程序啟動(dòng)時(shí)啟用,2.8 版本現(xiàn)在會(huì)將跟蹤事件發(fā)送到 Android systrace 記錄器,即使 Flutter 應(yīng)用程序構(gòu)建在發(fā)布模式下也會(huì)發(fā)送這些事件。
此外為了創(chuàng)建更少卡頓的動(dòng)畫效果,開發(fā)者可能會(huì)想要更多關(guān)于光柵緩存行為的性能跟蹤信息,因?yàn)檫@個(gè)行為對(duì)于 Flutter 來說是比較昂貴的,可以重復(fù)使用的圖片進(jìn)行 blit, 而不是在每一幀上重新繪制它們,在性能跟蹤中的新事件流現(xiàn)在允許跟蹤光柵緩存圖片的生命周期。
Flutter DevTools
對(duì)于調(diào)試性能問題,該版本的 DevTools 添加了一個(gè)新的“Enhance Tracing”功能,它可以幫助開發(fā)者診斷因昂貴的構(gòu)建、布局和繪制操作而導(dǎo)致的 UI 卡頓。
啟用這些跟蹤功能中的任何一個(gè)后,時(shí)間軸將包含用于構(gòu)建的 Widget、布置的渲染對(duì)象和繪制渲染對(duì)象的新事件(視情況而定)。

此外該版本的 DevTools 增加了分析應(yīng)用程序啟動(dòng)性能的支持,該配置文件包含從 Dart VM 初始化到第一個(gè) Flutter 幀渲染的 CPU 樣本。
在按下 “Profile app start up” 按鈕并加載應(yīng)用程序啟動(dòng)配置文件后,開發(fā)者將看到為配置文件選擇的 “AppStartUp” 用戶標(biāo)簽,另外還可以通過在可用用戶標(biāo)簽列表中,選擇此用戶標(biāo)簽過濾器(如果有)來加載應(yīng)用程序啟動(dòng)配置文件。
選擇此標(biāo)簽會(huì)顯示應(yīng)用啟動(dòng)的配置文件數(shù)據(jù)。

Web platform views
Android 和 iOS 并不是唯一獲得性能改進(jìn)的平臺(tái),該版本還改進(jìn)了 Flutter web 平臺(tái)的性能。
Flutter Web 使用 HtmlElementView Widget 實(shí)現(xiàn)了這一點(diǎn),它允許開發(fā)者在 Flutter Web 應(yīng)用程序中托管 HTML 元素。
如果開發(fā)者使用的是 google_maps_flutter 插件或 video_player 插件的 web 版本,或者你已經(jīng)遵循了 Flutter 團(tuán)隊(duì)關(guān)于如何優(yōu)化網(wǎng)絡(luò)上顯示圖像的建議,那么您其實(shí)已經(jīng)在使用 platform views。
在之前版本的 Flutter 中,platform view 會(huì)立即創(chuàng)建一個(gè)新的畫布,每個(gè)額外的平臺(tái)視圖都會(huì)添加另一個(gè)畫布,可是創(chuàng)建額外的畫布是很昂貴的,因?yàn)槊總€(gè)畫布都是整個(gè)窗口的大小。
所以該版本會(huì)復(fù)用早期平臺(tái)視圖創(chuàng)建的畫布,這意味著開發(fā)者可以在 HtmlElementView 的 Web 應(yīng)用中擁有多個(gè)實(shí)例而不會(huì)降低性能,同時(shí)還可以減少使用平臺(tái)視圖時(shí)的滾動(dòng)卡頓。
WebView 3.0
這次 webview_flutter 的另一個(gè)新版本是,這里提高了版本號(hào),是因?yàn)樾鹿δ艿臄?shù)量增加了,而且還因?yàn)?Web 視圖在 Android 上的工作方式可能發(fā)生了重大變化。
在之前的版本中, webview_flutter 的 hybrid composition 模式已經(jīng)可用,但并不是默認(rèn)設(shè)置。
hybrid composition 修復(fù)了先前默認(rèn) virtual displays 模式存在的許多問題,根據(jù)用戶反饋和問題跟蹤的結(jié)果,我們認(rèn)為是時(shí)候讓 hybrid composition 成為默認(rèn)設(shè)置了,另外 webview_flutter 還增加了一些要求很高的功能:
- 支持 POST 和 GET 來填充內(nèi)容(4450、4479、4480、4573)
- 從文件和字符串(4446、4486、4544、4558)加載 HTML
- 透明背景支持(3431、3431、4570)
- 在加載內(nèi)容之前編寫 cookie(4555、4555、4557)
此外在 3.0 版本中,webview_flutter 為新平臺(tái)提供了初步支持:web,這個(gè)支持允許開發(fā)者從單個(gè)代碼庫構(gòu)建 mobile 和 web 應(yīng)用,在 Flutter Web 應(yīng)用程序中托管 Web 視圖是什么樣的?從代碼的角度來看它看起來是一樣的:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:webview_flutter_web/webview_flutter_web.dart';
void main() {
runApp(const MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
// required while web support is in preview
if (kIsWeb) WebView.platform = WebWebViewPlatform();
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('Flutter WebView example')),
body: const WebView(initialUrl: 'https://flutter.dev'),
);
}
在 Web上運(yùn)行時(shí)它也會(huì)按開發(fā)者的預(yù)期工作:

請(qǐng)注意,其實(shí)當(dāng)前的 webview_flutter for web 的實(shí)現(xiàn)還有許多限制,因?yàn)樗鞘褂?構(gòu)建的 iframe 實(shí)現(xiàn)的。
它僅支持簡(jiǎn)單的 URL 加載,無法控制加載的內(nèi)容或者和加載的內(nèi)容交互
有關(guān)更多信息,請(qǐng)查看 webview_flutter_web Readme
但是 webview_flutter_web 由于太收歡迎,我們將作為 未經(jīng)認(rèn)可的插件提供,如果你想嘗試一下,請(qǐng)將以下行添加到 pubspec.yaml 中:
dependencies:
webview_flutter: ^3.0.0
webview_flutter_web: ^0.1.0 # add unendorsed plugin explicitly
Flutter Favorites
Flutter Ecosystem Committee 生態(tài)系統(tǒng)委員會(huì)再次召開會(huì)議,指定以下 Flutter Favorites 包:
- 三種自定義路由器包:
beamer,routemaster和go_router -
drift,一個(gè)功能強(qiáng)大且流行的 Flutter 和 Dart 響應(yīng)式持久化庫的重命名,構(gòu)建在sqlite -
freezed,一個(gè) Dart “語言補(bǔ)丁” 為定義模型、克隆對(duì)象、模式匹配等提供簡(jiǎn)單的語法 dart_code_metrics- 幾個(gè)非常好看的圖形用戶界面包:
flex_color_scheme,flutter_svg,feedback,toggle_switch,和auto_size_text
[圖片上傳失敗...(image-d24025-1639116490034)]
特定于平臺(tái)的軟件包
如果你是軟件包作者,必須選擇哪些平臺(tái)是將支持的,如果正在使用特定于平臺(tái)的本機(jī)代碼構(gòu)建插件,可以使用pluginClass項(xiàng)目中的屬性來實(shí)現(xiàn),該屬性pubspec.yaml指示提供功能的 native 類:
flutter:
plugin:
platforms:
android:
package: com.example.hello
pluginClass: HelloPlugin
ios:
pluginClass: HelloPlugin
但是隨著 Dart FFI 變得更加成熟,可以像 path_provider_windows 包一樣在 100% Dart 中實(shí)現(xiàn)用于特定平臺(tái)的功能,所以當(dāng)沒有任何本機(jī)類可以使用,但你仍想將你的包指定為僅支持某些平臺(tái)時(shí),請(qǐng)改用該dartPluginClass 屬性:
flutter:
plugin:
implements: hello
platforms:
windows:
dartPluginClass: HelloPluginWindows
使用這個(gè)配置后,即使沒有任何 native 代碼,也已將包指定為僅支持某些平臺(tái),另外還必須提供 Dart 插件類;可以在 flutter.dev 上的 Dart-only 平臺(tái)實(shí)現(xiàn)文檔中了解更多信息。
Firebase
關(guān)于它的一系列升級(jí)和更新,很大一塊,反正國內(nèi)用不上,懶得寫了
Desktop
Flutter 2.8 版本在 Windows、macOS 和 Linux 穩(wěn)定版本的道路上又邁出了一大步。 包括國際化和本地化支持,如最近的 中文IME支持、韓語IME支持和漢字IME支持。
一個(gè)為穩(wěn)定版本準(zhǔn)備的例子:完全重構(gòu) Flutter 處理鍵盤事件以允許同步響應(yīng),這使 Widget 能夠處理按鍵并取消其在 tree 的其余部分中傳播。
最初是在 Flutter 2.5 和 Flutter 2.8 中添加了對(duì)問題的回歸和修復(fù),這是重新設(shè)計(jì)處理特定于設(shè)備的鍵盤輸入的方式,重構(gòu) Flutter 處理文本編輯方式來達(dá)到補(bǔ)充的目的,所有這些都是鍵盤輸入密集型桌面應(yīng)用程序所必需。
此外我們會(huì)繼續(xù)擴(kuò)展 Flutter 對(duì)視覺密度的支持并為對(duì)話框公開對(duì)齊方式,以實(shí)現(xiàn)更加桌面友好的 UI。
最后 Flutter 團(tuán)隊(duì)并不是唯一一個(gè)在 Flutter 桌面上工作的人,舉個(gè)例子,Canonical 的桌面團(tuán)隊(duì)正在與 Invertase 合作,在 Linux 和 Windows 上實(shí)現(xiàn)最流行的 Flutter Firebase 插件。
DartPad
DartPad 的改進(jìn),其中最大的改進(jìn)是對(duì)更多包的支持,事實(shí)上現(xiàn)在有 23 個(gè)包可供導(dǎo)入,除了幾個(gè) Firebase 服務(wù),該名單包含常用軟件如 bloc,characters,collection,google_fonts,和 flutter_riverpod ,DartPad 團(tuán)隊(duì)會(huì)繼續(xù)添加新的軟件包,因此如果想查看當(dāng)前支持哪些軟件包,請(qǐng)單擊右下角的信息圖標(biāo)。
還有另一個(gè)新的 DartPad 功能也非常方便。以前 DartPad 總是運(yùn)行最新的穩(wěn)定版本,在此版本中可以使用狀態(tài)欄中的新頻道菜單,來選擇最新的 Beta 頻道版本以及之前的穩(wěn)定版本(稱為“舊頻道”)。
Removing the dev channel
Flutter “channel” 控制著底層 Flutter 框架和引擎在你的開發(fā)機(jī)器上變化的速度,Stable 代表最少的問題,而 master 代表最多。
由于資源限制,我們最近停止更新 dev channel。雖然為此我們確實(shí)收到了一些關(guān)于此的問題,但我們發(fā)現(xiàn)只有不到 3% 的 Flutter 開發(fā)人員使用該dev渠道。
因此我們決定正式退役的進(jìn)程dev渠道,因?yàn)楹苌儆虚_發(fā)人員使用 dev 頻道,但 Flutter 工程師需要花費(fèi)大量時(shí)間和精力來維護(hù)它。
你可以使用該 flutter channel 命令決定想要哪個(gè)頻道,以下是 Flutter 團(tuán)隊(duì)對(duì)每個(gè)頻道的看法:
stable頻道代表我們擁有的最高質(zhì)量的構(gòu)建。它們每季度(大致)發(fā)布一次,并針對(duì)中間的關(guān)鍵問題進(jìn)行熱修復(fù),這就是“慢”通道:安全、成熟、長期服務(wù)。beta頻道為那些習(xí)慣于更快節(jié)奏的人提供了一種快速移動(dòng)的替代方案。目前每月發(fā)布。master頻道是我們活躍的開發(fā)頻道,我們不提供對(duì)該頻道的支持,但我們針對(duì)它運(yùn)行了一套全面的單元測(cè)試。
當(dāng) dev 在未來幾個(gè)月停用該頻道時(shí),請(qǐng)考慮 beta 或 master頻道,具體取決于對(duì)問題的容忍度以及對(duì)最新和最好的需求。
Breaking Changes
與往常一樣,我們都在努力減少每個(gè)版本中重大更改的數(shù)量,在此版本中,F(xiàn)lutter 2.8 除了已過期并根據(jù)我們的重大變更政策已被刪除的已棄用 API 之外,沒有重大變更:
- 90292刪除autovalidate棄用
- 90293刪除FloatingHeaderSnapConfiguration.vsync棄用
- 90294刪除AndroidViewController.id棄用
- 90295刪除BottomNavigationBarItem.title棄用
- 90296刪除不推薦使用的文本輸入格式類
總結(jié)
看完 Flutter 2.8 的更新,最主要是關(guān)于性能、穩(wěn)定性和 WebView 的調(diào)整,本質(zhì)上這個(gè)版本應(yīng)該會(huì)比較友好,因?yàn)閹缀鯖]有 Breaking Changes ,所以值得一試,推薦等 2.8.3 之后的版本。
本文轉(zhuǎn)自 https://blog.csdn.net/ZuoYueLiang/article/details/121808623?utm_medium=distribute.pc_category.none-task-blog-hot-1.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-1.nonecase,如有侵權(quán),請(qǐng)聯(lián)系刪除。