Flutter 2.8 release 發(fā)布,快來看看新特性吧

原文鏈接: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ā)送這些事件。

image

此外為了創(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 卡頓

image

啟用這些跟蹤功能中的任何一個(gè)后,時(shí)間軸將包含用于構(gòu)建的 Widget、布置的渲染對(duì)象和繪制渲染對(duì)象的新事件(視情況而定)。

image

此外該版本的 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ù)。

image

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 還增加了一些要求很高的功能:

此外在 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)?zhí)砑訄D片描述

請(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 包:

[圖片上傳失敗...(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。

image

最后 Flutter 團(tuán)隊(duì)并不是唯一一個(gè)在 Flutter 桌面上工作的人,舉個(gè)例子,Canonical 的桌面團(tuán)隊(duì)正在與 Invertase 合作,在 Linux 和 Windows 上實(shí)現(xiàn)最流行的 Flutter Firebase 插件。

image

DartPad

DartPad 的改進(jìn),其中最大的改進(jìn)是對(duì)更多包的支持,事實(shí)上現(xiàn)在有 23 個(gè)包可供導(dǎo)入,除了幾個(gè) Firebase 服務(wù),該名單包含常用軟件如 bloccharacters,collectiongoogle_fonts,和 flutter_riverpod ,DartPad 團(tuán)隊(duì)會(huì)繼續(xù)添加新的軟件包,因此如果想查看當(dāng)前支持哪些軟件包,請(qǐng)單擊右下角的信息圖標(biāo)。

image

還有另一個(gè)新的 DartPad 功能也非常方便。以前 DartPad 總是運(yùn)行最新的穩(wěn)定版本,在此版本中可以使用狀態(tài)欄中的新頻道菜單,來選擇最新的 Beta 頻道版本以及之前的穩(wěn)定版本(稱為“舊頻道”)。

image

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)考慮 betamaster頻道,具體取決于對(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)系刪除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容