关于flutter:Flutter-22-更新详解

7次阅读

共计 16929 个字符,预计需要花费 43 分钟才能阅读完成。

Flutter 2.2 版已正式公布!要获取新版本,您只需切换到 stable 渠道并更新目前装置的 Flutter,或返回 flutter.cn/docs/get-started 从头开始装置。

尽管与 2.0 版只相隔数月,2.2 版还是满载大量改良。此版本共计纳入了框架、引擎和插件库等方面的 2,456 个 PR 并解决了 3,105 个问题。咱们要特此鸣谢为此版本奉献了大量 PR 和 PR review 的整个 Flutter 社区,包含 PR 奉献最多 (17) 的 Abhishek01039 和 PR review 奉献最多 (9) 的 xu-baolin。衷心感谢所有开发者对 Flutter 2.2 顺利公布稳定版做出的奉献。没有大家的反对,咱们将无奈做到。

每个新的 Flutter 稳定版都会带来诸如性能晋升、新性能、bug 修复等一系列变动,并会提供一些尚未试用于生产环境的试验性功能,心愿您能帮忙咱们验证这些性能是否失常工作并满足您的需要。此外,新版本还会蕴含一系列相干工具的更新和来自 Flutter 社区的更新。坦白讲,现在 Flutter 每个新版本的内容都十分丰盛,不可能在一篇文章中巨细无遗地详述,因而上面咱们将着重为您介绍一些次要亮点。

Flutter 2.2 稳定版更新

此版本在 Flutter 2 的根底上做了诸多改良,其中岂但有面向 Android、iOS 和 web 平台的更新,还有新的 Material 图标、文本处理形式的改良、滚动条行为的变动、TextSpan widget 的鼠标光标反对,以及用一份代码适配多个平台方面的新指南。这些性能皆已公布稳定版,可供您在正式版利用中应用。同时,所有这些性能都是在 新版 Dart 的根底上构建而成。

Dart 2.13

随 Flutter 2.2 版一起公布的还有 Dart 2.13 版。此 Dart 版本蕴含泛滥新性能,其中之一是新的类型别名,该性能让您可为类型创立别名,就像为函数创立别名一样:

// 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 更新

作为 Flutter 稳定版最新反对的平台,web 平台在此版本也有多项改良。

首先,咱们借助新的 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 图标

说起 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,还反对 onEnteronExit。这些改良看似细小,对用户体验的影响却大,能让 Flutter 利用提供更贴近用户预期的应用体验。

Flutter 2.2 中新的预览版性能

除了实用于生产环境的新性能,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 在第一个帧工作负载开始之前对捆绑的着色器进行编译。

利用启动期间的预编译操作的跟踪记录

不过,此解决方案存在一些不足之处:

  • 相比 OpenGL 后端,Skia 仍会为 Metal 后端生成更多的着色器。
  • 最终将着色器编译为机器码的操作依然与帧工作负载同步产生,但这好过在帧渲染时段内执行所有着色器生成和编译操作。
  • 最终生成的机器码会在利用首次运行后失去缓存,直到设施被重新启动。

如果您心愿在本人的利用中应用此新性能,能够参考 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 生态系统和工具更新

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 包含:

  • FlutterFire package (正式版) : cloud_firestorecloud_functionsfirebase_authfirebase_corefirebase_crashlyticsfirebase_messagingfirebase_storage
  • Flutter Community “plus” package: android_alarm_manager_plusandroid_intent_plusbattery_plusconnectivity_plusdevice_info_plusnetwork_info_pluspackage_info_plussensors_plusshare_plus
  • googleapis package
  • win32 package
  • Intlcharacters package
  • Sentry package: sentry 和 sentry_flutter
  • infinite_scroll_paginationflutter_native_splash package

所有这些 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 集成做的多项更新:

  • 用于读写数据的 Typesafe API
  • 反对 Firebase Local Emulator Suite
  • 利用 data bundles 优化您的数据查问

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 泛滥改良中的几项。如需残缺列表,请查看下列布告:

  • Flutter DevTools 2.1 版本阐明
  • Flutter DevTools 2.2.1 版本阐明
  • Flutter DevTools 2.2.3 版本阐明

IDE 插件更新

在此版本中,针对 Flutter 的 Visual Studio Code 和 IntelliJ/Android Studio IDE 扩大也失去了更新。例如,Visual Studio Code 扩大当初反对两项额定的 Dart 代码重构: 内联函数和内联本地变量。

实战演示: 新的 “ 内联函数 ” Dart 重构

在 Android Studio/IntelliJ 扩大中,咱们新增了一个在控制台中输入所有堆栈轨迹的选项。

您当初能够输入所有堆栈轨迹,而不仅限于第一条

如果我的项目中某个问题的本源是在另一个 package,以前相干轨迹不会纳入到输入中,这项新性能就能够派上大用场。但随之而来的一个问题是,该如何让轨迹信息更易于梳理解读?咱们曾经有了一些想法,欢送关注后续相干改变。

如需此版本中 IDE 扩大的残缺变更列表,请查看下列布告:

  • VS Code 扩大 v3.21
  • VS Code 扩大 v3.22
  • Flutter IntelliJ 插件 M55 版本
  • Flutter IntelliJ 插件 M56 版本

DartPad 随堂实际

为了确保 Flutter 开发者社区蓬勃发展的同时让相干文档也能跟上脚步,Dart 和 Flutter 团队始终在千方百计改良和拓展相干培训内容的制作方法。在此版本中,咱们为 DartPad 增加了一个新的分步式界面,让开发者在学习讲师主导的课程 / 讲座时能够不便地随堂入手实际。

实战演示: DartPad 课程 / 讲座随堂实际

通过将实际指引间接退出到 DartPad 中,咱们在往年的 I/O 大会实现了 疏导式讲座体验。不过,此性能并非专为咱们本人的需要而开发,如果您要在本人的 Dart 或 Flutter 课程 / 讲座中应用该工具,能够按 DartPad 培训内容创作指南 中的阐明操作。请勿将此性能与 在 Gist 中通过 DartPad 分享代码 和 在您的网站上嵌入 DartPad 这两项性能相混同,后两者曾经推出了一段时间。

咱们心愿所有 Dart 和 Flutter 内容作者都可能为其受众带去丰盛的互动式体验。欢送试用并 向咱们提供反馈。

社区聚焦: FlutterFlow

FlutterFlow 是一个 “ 低代码 ” (low code) 利用设计和开发工具,用于在浏览器中构建利用。它提供了一个 “ 所见即所得 ” 环境,让您可依据理论 Firebase 数据来设计横跨多个页面的利用布局。此工具的指标是让您可能轻松执行大部分常见操作,并尽量减少您本人须要编写的代码量。实际上,在一次演示中,演示者不到一个小时就应用此工具构建出了一个蕴含多个页面、可帮忙用户旅行大都会艺术博物馆的残缺挪动利用,整个过程没有写一行代码。您能够在 YouTube 上观看整个过程的 视频记录。

对兼容性有影响的重大变更

判若两人,咱们会尽量避免进行影响兼容性的重大变更。在此版本中,此类变更仅限于移除上面这些已废除的组件:

  • 73750 移除已废除的 BinaryMessages
  • 73751 移除已废除的 TypeMatcher 类

您能够 在 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 函数来生成自定义社交内容。机不可失,连忙一睹为快吧!

正文完
 0