This commit is contained in:
guoshuyu 2021-12-23 15:15:51 +08:00
parent e9948bd194
commit 377f8ff81d
14 changed files with 2956 additions and 1 deletions

267
Dart-212.md Normal file
View File

@ -0,0 +1,267 @@
今天 Dart 2.12 发布了该版本具有稳定的空安全声明和Dart FFI版本。
空安全是最新的关键生产力功能,旨在帮助开发者避免空错误,这是一项通常很难被发现的错误。
FFI是一种互操作性机制可以让开发者调用 C 语言编写的现有代码,例如调用 Windows Win32 API。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-212/image1)
### Dart平台的独特功能
在详细解释空安全声明和 FFI 之前,让我们先讨论一下 Dart 平台如何将它适合我们的目标平台上。
编程语言通常倾向于共享许多功能,例如许多语言支持面向对象的编程或在在 Web 上运行,真正使语言与众不同的是它们独特的功能组合。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-212/image2)
Dart的独特功能涵盖了三个方面
- 可移植性:高效的编译器为设备生成 x86 和 ARM 机器代码,并为 Web 生成优化后的JavaScript代码。所以 Dart 的持续目的就是支持:移动设备、台式机、应用后端等等。大量的库和软件包提供了可在所有平台上使用的一致性 API从而进一步降低了创建真正的多平台应用程序的成本。
- 高效Dart平台支持热重装从而可以对本机设备和Web进行快速地迭代和开发。Dart提供了丰富的结构如` isolates` 和 `async/await`,用于处理常见的并发和事件驱动的模式。
- 健壮Dart 是健全的null 安全系统会在开发过程中捕获错误。整个平台具有高度的可扩展性和可靠性Dart 已经有十多年的历史被运用于生产开发,其中包括 Google Ads和Google Assistant等业务关键型应用程序。
> PS事实上被大规模应用还是因为近几年的 Flutter
可靠的空安全声明使类型系统更加强大,并具更好的性能,而 Dart FFI 可以让开发者用现有的 C 库来得到了更便捷的可移植性可以选择对性能要求很高的任务使用经过C代码来调度实现。
### 空安全声明
自 Dart 2.0 引入空安全声明以来,空安全声明是 Dart 语言的最大补充。空安全性进一步增强了类型系统,使得开发者能够在开发阶段就捕获到空错误,这是过去应用程序崩溃的常见原因。
合理的空安全声明是围绕一些[核心原则设计](https://dart.dev/null-safety#null-safety-principles)的,接下来让我们了解下这对开发人员会有声明影响。
### 默认情况下不可为空
空安全声明之前的核心挑战是,开发者无法分辨**传递空值的代码与不能使用空值的代码之间的区别**。
几个月前,我们在 Flutter master channel 中发现了一个错误,该错误会在某些机器配置上会使得各种 flutter 工具命令崩溃,并出现 null 错误:`The method '>=' was called on null` 而根本的问题是这样的代码:
```
final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
// plugin path of Android Studio changed after version 4.1.
if (major >= 4 && minor >= 1) {
...
```
发现错误的地方了吗?因为 `version` 可以为 `null` ,所以 `major``minor` 也可以为 null。
这样的独立错误看起来很容易被发现但实际上即使是经过严格的代码审查过程如Flutter Code Review这样的代码也始终无处不在。所以出于安全考虑静态分析会立即捕获此问题。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-212/image3)
那是一个非常简单的错误,而在 Google 的内部,早期使用 null 安全性的过程中,我们发现了很多复杂的错误,其中一些是已经存在多年的 bug但是如果没有 null 安全性的额外静态检查,团队就无法找到原因。
这里有一些例子:
- 一个内部团队发现,他们经常检查到永远不能为 null 的表达式得到了 null 值。使用protobuf 的代码中最经常出现此问题其中可选字段在未设置时返回默认值并且永远不会为null。如此一来通过混淆默认值和空值代码错误地检查了默认条件。
- Google Pay 小组在 Flutter 代码中发现了一些错误,这些错误会在 `State` 在上下文之外尝试访问 Flutter 对象的 `Widget` 。在实现 null 安全之前,这些对象将返回 null并掩盖错误出于安全考虑声明分析确定这些属性永远不会为空并引发了分析错误。
- Flutter 小组发现了一个错误,如果将 `null``scene` 参数传递给 `Window.render()`Flutter 引擎可能会崩溃。在进行 null 安全迁移期间,他们添加了一个提示,将 `Scene` 标记为 `non-nullable`,然后能够轻松地防止可能触发 null 的潜在应用崩溃。
### 默认情况下使用非空
一旦启用空安全,变量声明的基本行为会被改变,因为默认的类型是不可为空:
```
// In null-safe Dart, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();
```
如果要创建一个可以包含值或 null 的变量,则需要通过 ? 在类型声明中添加后缀来使该变量在变量声明中显式显示:
```
// aNullableInt can hold either an integer or null.
int? aNullableInt = null;
```
空安全性的实现是健壮的并且具有丰富的静态流分析功能使用可空类型的工作变得更加容易。例如在检查了null之后Dart将局部变量的类型从 nullable 提升为 non-nullable
```
int definitelyInt(int? aNullableInt) {
if (aNullableInt == null) {
return 0;
}
// aNullableInt has now promoted to a non-null int.
return aNullableInt;
}
```
我们还添加了一个新关键字 `required ` ,当命名参数被标记为 `required`在Flutter小部件API中经常发生并且调用者忘记提供参数时就会发生分析错误
![](http://img.cdn.guoshuyu.cn/20211223_Dart-212/image4)
### 逐步迁移到空安全性
因为空安全性改变了我们的编码习惯,所以如果坚持强制采用,那将是极度破坏性的。所以我们决定让开发者在最需要的时候启用,所以空安全是一项可选功能:你可以用 Dart 2.12 而无需被迫启用空安全,你甚至可以依赖已经启用了空安全性的软件包,无论应用程序或软件包是否启用了空安全性。
为了帮助开发者将现有代码迁移到安全性状态,我们提供了迁移工具和迁移指南。这些工具首先将分析所有现有代码,然后开发者可以交互地查看该工具推断的可空性属性。
如果开发者不同意该工具的结论,则可以通过添加可空性提示以更改推断,添加一些迁移提示可能会对迁移的质量带来较大的影响。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-212/image5)
目前使用 `dart create``flutter create` 不启用空安全性声明创建的新程序包和应用程序。使用 `dart migrate` 可以简单地启用空安全的功能。
### Dart 生态系统的空安全迁移状况
在过去的一年中,我们提供了几种空安全声明的预览版和 Beta 版,目的是为生态系统植入支持空安全的软件包。
这项准备工作很重要,因为我们建议按顺序迁移,以确保空安全声明不会影响开发者现有的应用,开发者在所以依赖完成迁移之前最好不要启动空安全配置。
DartFlutterFirebase 和 Material 团队已经发布提供的数百个具备 null 安全的软件包的版本,而且我们已经从惊人的 Dart 和 Flutter 生态系统中获得了巨大的支持因此pub.dev 现在有超过一千个支持 null 安全的软件包。
重要的是最受欢迎的那些软件包已首先完成迁移因此对于今天的发布而言最流行的前100个软件包中有98是支持 null safety前250个顶级软件包中的 78 和前500个顶级软件包中的 57 也已经支持零安全性。
我们期待在未来几周内在 pub.dev 上看到更多具有空安全性的软件包。分析表明pub.dev 上的绝大多数软件包已被解除阻止,可以开始迁移。
### 完全空安全性的好处
完全迁移后Dart 的空安全性就可以启用了,这意味着 Dart 100 确保具有不可为 null 的类型的表达式不能为 null 。
当 Dart 分析开发者的代码并确定某个变量不可为空时,该变量将始终为不可为空,而 Dart 与 Swift 共享空安全声明,这在其他编程语言上很少见。
> PS Kotlin 有话要说
Dart 空安全声明的健壮性性还具有另一个意义:**这意味着您的程序可以更小,更快**。
由于 Dart 确保不可为空的变量永远不会为 null ,因此 Dart 可以进行优化。例如 Dart 提前AOT编译器可以生成更小更快的本机代码因为当知道变量不为 null 时,它不需要添加对 null 的检查。
### Dart FFI用于将Dart与C集成
Dart FFI 让开发者能够利用 C 语言中的现有代码,以实现更好的可移植性,并且利用调整的 C 代码集成以执行对性能要求较高的任务。
从Dart 2.12 开始Dart FFI 已脱离Beta阶段现已被认为稳定并且可以投入生产我们还添加了一些新功能包括嵌套结构和按值传递结构。
#### 通过值传递结构
可以在C代码中按引用和按值传递结构FFI 以前仅支持按引用传递,但从 Dart 2.12 开始开发者可以按值传递结构,例如:
```
struct Link {
double value;
Link* next;
};
void MoveByReference(Link* link) {
link->value = link->value + 10.0;
}
Coord MoveByValue(Link link) {
link.value = link.value + 10.0;
return link;
}
```
#### 嵌套结构
C API 通常使用嵌套结构-本身包含结构体的结构,例如以下示例:
```
struct Wheel {
int spokes;
};
struct Bike {
struct Wheel front;
struct Wheel rear;
int buildYear;
};
```
从Dart 2.12开始FFI支持嵌套结构。
### API变更
为了完善 FFI 稳定并支持上述功能我们进行了一些较小的API更改。
现在禁止创建空结构 ([#44622](https://github.com/dart-lang/sdk/issues/44622)) ,并产生弃用警告,开发者可以使用新的类型 `Opaque` 来表示空结构。
`dart:ffi``sizeOf``elementAt` 以及 `ref` 现在需要编译时类型参数([44621](https://github.com/dart-lang/sdk/issues/44621))因为 `package:ffi` 已添加了新的便利功能,所以在常见情况下,不需要分配和释放内存。
```
// Allocate a pointer to an Utf8 array, fill it from a Dart string,
// pass it to a C function, convert the result, and free the arg.
//
// Before API change:
final pointer = allocate<Int8>(count: 10);
free(pointer);
final arg = Utf8.toUtf8('Michael');
var result = helloWorldInC(arg);
print(Utf8.fromUtf8(result);
free(arg);
// After API change:
final pointer = calloc<Int8>(10);
calloc.free(pointer);
final arg = 'Michael'.toNativeUtf8();
var result = helloWorldInC(arg);
print(result.toDartString);
calloc.free(arg);
```
### 自动生成FFI绑定
对于较大的 API 暴露,在编写与 C 代码集成的 Dart 绑定可能会非常耗时,为了减轻这种负担,我们构建了一个绑定生成器,用于根据 C 头文件自动创建 FFI 包装器 `package:ffigen`
### FFI路线图
随着核心 FFI 平台的完成我们将重点转移到扩展FFI功能上使其具有在核心平台之上分层的功能我们正在调查的一些功能包括
- 特定于ABI的数据类型例如intlongsize_t [36140](https://github.com/dart-lang/sdk/issues/36140)
- 内联结构中的数组 [35763](https://github.com/dart-lang/sdk/issues/35763)
- 打包的结构 [38158](https://github.com/dart-lang/sdk/issues/38158)
- 联合类型 [38491](https://github.com/dart-lang/sdk/issues/38491)
- 将 finalizers 暴露给 Dart[35770](https://github.com/dart-lang/sdk/issues/35770)
### FFI的示例用法
前面我们已经讲了 Dart FFI 的许多创造性用法,以与各种基于 C 的API集成这里有一些例子
- [open_file](https://pub.dev/packages/open_file) 是用于跨多个平台打开文件的单个API它使用 FFI 来调用 WindowsmacOS 和Linux上的本机操作系统API。https://pub.dev/packages/open_file
- [win32](https://pub.dev/packages/win32) 封装了最常见的Win32 API从而可以直接从Dart调用各种Windows API。https://pub.dev/packages/win32
- [objectbox](https://pub.dev/packages/objectbox) 是由基于C的实现支持的快速数据库。https://pub.dev/packages/objectbox
- [tflite_flutter](https://pub.dev/packages/tflite_flutter) 使用FFI包装TensorFlow Lite API。
### Dart语言的下一步是什么
空安全声明是我们几年来对 Dart 语言所做的最大改变,接下来我们将考虑在我们强大的基础上对语言和平台进行更多的增量更改。
我们在语言设计渠道中正在尝试的一些事情:
- Type aliases [65](https://github.com/dart-lang/language/issues/65):可以为非函数类型创建类型别名,例如可以创建一个 `typedef` 并将其用作变量类型:
```
typedef IntList = List <int>;
IntList il = [1,2,3];
```
- Type aliases [120](https://github.com/dart-lang/language/issues/120):添加了一个新的,完全可重写的 `>>>` 运算符,用于对整数进行无符号移位。
- Generic metadata annotations [1297](https://github.com/dart-lang/language/issues/1297):扩展元数据注释以也支持包含类型参数的注释。
- Static meta-programming [1482](https://github.com/dart-lang/language/issues/1482):支持静态元编程 — Dart程序在编译过程中会生成新的Dart 源代码,类似于 Rust 宏和 Swift 函数生成器(该功能仍处于早期探索阶段,但是我们认为它可以启用当今依赖于代码生成的用例。)
### Dart 2.12 is available now
Dart 2.12 和 Flutter 2.0 SDK 现已提供具有可靠的空安全性和稳定FFI的所以请花点时间查看 Dart 和 Flutter 的已知的无效安全问题,如果你发现任何其他问题,请在 Dart tracker 中报告这些问题。
> https://github.com/dart-lang/sdk/issues
如果你已经在pub.dev上发布了软件包请立即查看迁移指南并了解如何迁移以达到安全性。迁移软件包可能会帮助解除阻止其他依赖于该软件包的软件包和应用程序并且我们还要感谢已经迁移的人

140
Dart-214.md Normal file
View File

@ -0,0 +1,140 @@
> 原文链接: https://medium.com/dartlang/announcing-dart-2-14-b48b9bb2fb67
Dart 2.14 的发布对 Apple Silicon 处理器提供了更好的支持,并新增了更多提升生产力的功能,例如通过代码样式分析捕获 lint 错误、更快的发布工具、更好的级联代码格式以及一些细小的语言特性更新。
## Dart SDK 对 Apple Silicon 支持
自从在 2020 年末 Apple 发布了新的 [Apple Silicon](https://support.apple.com/en-us/HT211814) 处理器以来, Dart SDK 一直致力于增加对该处理器上的 Native 执行支持。
现在从 Dart 2.14.1 正式增加了对 Apple Silicon 的支持,当 [下载](https://dart.dev/get-dart) MacOS 的 Dart SDK时一定要选择 ARM64 选项,**这里需要额外注意, Flutter SDK 中的 Dart SDK 还没有绑定这一项改进**。
本次更新支持在 Apple Silicon 上运行 SDK/Dart VM 本身,以及对 `dart compile` 编译后的可执行文件在 Apple Silicon 上运行的支持,**由于 Dart 命令行工具使用原生 Apple Silicon ,因此它们的启动速度会快得多** 。
## Dart 和 Flutter 共享的标准 lint
开发人员通常会需要他们的代码遵循某种风格,其中许多规则不仅仅是风格偏好(如众所周知的制表符与空格的问题),还涵盖了可能导致错误或引入错误的编码风格。
比如 **Dart 风格指南要求对所有控制流结构使用花括号**,例如 `if-else` 语句,这可以防止经典的 [dangling else](https://en.wikipedia.org/wiki/Dangling_else) 问题,也就是在多个嵌套的 `if-else` 语句上会存在解释歧义。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-214/image1)
另一个例子是类型推断,虽然在声明具有初始值的变量时使用类型推断没有问题,但**在[声明未初始化的变量](https://dart-lang.github.io/linter/lints/prefer_typing_uninitialized_variables.html) 时指定类型很重要,因为这可以确保类型安全**。
![](http://img.cdn.guoshuyu.cn/20211223_Dart-214/image2)
良好代码风格的通常是通过代码审查来维持,但是通过在编写代码时,运行静态分析来强制执行规则通常会更有效得多。
在 Dart 中,这种静态分析规则是高度[可配置的](https://dart.dev/guides/language/analysis-options)Dart 提供了有[数百条样式规则](https://dart.dev/tools/linter-rules)(也称为*lints*),有了如此丰富的选项,选择启用这些的规则时,一开始可能会有些不知所措。
> 配置支持: https://dart.dev/guides/language/analysis-options
>
> lint 规则: https://dart.dev/tools/linter-rules
Dart 团队维护了一个 [Dart 风格指南](https://dart.dev/guides/language/effective-dart/style),它描述了 Dart 团队认为编写和设计 Dart 代码的最佳方式。
> 风格指南: https://dart.dev/guides/language/effective-dart/style
许多开发人员以及 pub.dev 站点[评分](https://pub.dev/help/scoring)引擎都使用了一套叫 [Pedantic](https://github.com/google/pedantic) 的 lint 规则, Pedantic 起源于 Google 内部的 Dart 风格指南,由于历史原因它不同于一般的 Dart 风格指南,此外 Flutter 框架也从未使用过 Pedantic 的规则集,而是拥有自己的一套规范规则。
这听起来可能有点混乱,但是在本次的 2.14 发布中Dart 团队很高兴地宣布**现在拥有一套全新的 lint 集合来实现代码样式指南**,并且 Dart 和 Flutter SDK 默认情况下将这些规则集用于新项目:
- [`package:lints/core.yaml`](https://github.com/dart-lang/lints/blob/main/lib/core.yaml) **所有 Dart 代码都应遵循的 Dart 风格指南中的主要规则pub.dev 评分引擎已更新为 lints/core 而不是 Pedantic。**
- `package:lints/recommended.yaml` :核心规则之外加上推荐规则,建议将它用于所有通用 Dart 代码。
- `package:flutter_lints/flutter.yaml`:核心和推荐之外的 Flutter 特定推荐规则,这个集合推荐用于所有 Flutter 代码。
如果你已经存在现有的 Dart 或者 Flutter项目强烈建议升级到这些新规则集从 pedantic 升级只需几步https://github.com/dart-lang/lints#migrating-from-packagepedantic 。
## Dart 格式化程序和级联
Dart 2.14 对 Dart 格式化程序如何使用[级联](https://dart.dev/guides/language/language-tour#cascade-notation) 格式化代码进行了一些优化。
以前格式化程序在某些情况下出现一些令人困惑的格式,例如 `doIt()` 在这个例子中调用了什么?
```dart
var result = errorState ? foo : bad..doIt();
```
它看起来像是被 `bad` 调用 **但实际上级联适是用于整个 `?` 表达式上的**,因此级联是在该表达式的结果上调用的,而不仅仅是在 false 子句上,新的格式化程序清晰地描述了这一点:
```dart
var result = errorState ? foo : bad\
..doIt();
```
Dart 团队还大大提高了格式化包含级联的代码的速度;在[协议缓冲区](https://developers.google.com/protocol-buffers/docs/reference/dart-generated)生成的 Dart 代码中,可以看到格式化速度提高了 10 倍。
## Pub 支持忽略文件
目前当开发者将包[发布](https://dart.dev/tools/pub/publishing)到[pub.dev](https://pub.dev/)社区时pub 会抓取该文件夹中的所有文件,但是会跳过隐藏文件(以 . 开头的文件)和`.gitignore` 文件。
Dart 2.14 中更新的 pub 命令支持新 `.pubignore` 文件,开发者可以在其中列出不想上传到 pub.dev 的文件,此文件使用与 `.gitignore` 文件相同的格式。
> 有关详细信息,请参阅包发布文档 https://dart.dev/tools/pub/publishing#what-files-are-published
## Pub and "dart test" 性能
虽然 pub 最常用于管理代码依赖项,但它还有第二个重要的用途:驱动工具。
比如 Dart 测试工具通过 `dart test` 命令运行,而它实际上只是 `command pub run test:test` 命令的包装, `package:test` 在调用该 `test` 入口点之前pub 首先将其编译为可以更快运行的本机代码。
在 Dart 2.14 之前对 pubspec 的任何更改(包括与 `package:test` 无关的更改)都会使此测试构建无效,并且还会看到一堆这样的输出,其中包含“预编译可执行文件”:
```
$ dart test\
Precompiling executable... (11.6s)\
Precompiled test:test.\
00:01 +1: All tests passed!
```
在 Dart 2.14 中pub 在构建步骤方面更加智能,让构建仅在版本更改时发生,此外还使用并行化改进了执行构建步骤的方式,因此可以完成得更快。
## 新的语言功能
Dart 2.14 还包含一些语言特性变化。
首先添加了一个新的 [三重移位](https://github.com/dart-lang/language/issues/120) 运算符 ( `>>>`),这类似于现有的移位运算符 ( `>>`),但 `>>` 执行算术移位,`>>>` 执行逻辑或无符号移位,其中零位移入最高有效位,而不管被移位的数字是正数还是负数。
此次还删除了对类型参数的旧限制,该限制不允许使用泛型函数类型作为类型参数,以下所有内容在 2.14 之前都是无效的,但现在是允许的:
```dart
late List<T Function<T>(T)> idFunctions;
var callback = [<T>(T value) => value];
late S Function<S extends T Function<T>(T)>(S) f;
```
最后对注释类型进行了小幅调整,(诸如 `@Deprecated` 在 Dart 代码中常用来捕获元数据的注解)以前注解不能传递类型参数,因此 `@TypeHelper<int>(42, "The meaning")` 不允许使用诸如此类的代码,而现在此限制现已取消。
## 包和核心库更改
对核心 Dart 包和库进行了许多增强修改,包括:
- `dart:core` 添加了静态方法 `hash`、`hashAll` 和 `hashAllUnordered`
- `dart:core` `DateTime` 类现在可以更好地处理本地时间。
- `package:ffi`:添加了对使用 [arena](https://pub.dev/documentation/ffi/latest/ffi/Arena-class.html) 分配器管理内存的支持([示例](https://github.com/dart-lang/sdk/blob/master/samples/ffi/resource_management/arena_sample.dart)。Arenas 是一种[基于区域的内存管理](https://en.wikipedia.org/wiki/Region-based_memory_management)形式,一旦退出 arena/region 就会自动释放资源。
- `package:ffigen`:现在支持从 C 类型定义生成 Dart 类型定义。
## 重大变化
Dart 2.14 还包含一些重大更改,预计这些变化只会影响一些特定的用例。
### [#46545](https://github.com/dart-lang/sdk/issues/46545):取消对 ECMAScript5 的支持
[所有浏览器都](https://caniuse.com/es6)支持最新的 ECMAScript 版本,因此两年前 Dart 就[宣布](https://groups.google.com/a/dartlang.org/g/announce/c/x7eDinVT6fM/m/ZSFl2a9tEAAJ?pli=1) 计划弃用对 ECMAScript 5 (ES5) 的支持,这使 Dart 能够利用最新 ECMAScript 中的改进并生成更小的输出,**在 Dart 2.14 中这项工作已经完成Dart Web 编译器不再支持 ES5。因此不再支持较旧的浏览器例如 IE11**。
### [#46100](https://github.com/dart-lang/sdk/issues/46100):弃用 stagehand、dartfmt 和 dart2native
在 2020 年 10 月的 [Dart 2.10 博客文章中](https://medium.com/dartlang/announcing-dart-2-10-350823952bd5) 宣布了将所有 Dart CLI 开发人员工具组合成一个单一的组合`dart`工具(类似于该`flutter`工具),而现在 Dart 2.14 弃用了 `dartfmt``dart2native` 命令,并停止使用 `stagehand` ,这些工具在统一在 `dart-tool` 中都有等价的替代品。
### [#45451](https://github.com/dart-lang/sdk/issues/45451):弃用 VM Native 扩展
Dart SDK 已弃用 Dart VM 的 Native 扩展,这是从 Dart 代码调用 Native 代码的旧机制Dart [FFI](https://dart.dev/guides/libraries/c-interop)(外来函数接口)是当前用于此用例的新机制,正在积极[发展](https://medium.com/dartlang/announcing-dart-2-13-c6d547b57067) 以使其功能更加强大且易于使用。

257
Dart-215.md Normal file
View File

@ -0,0 +1,257 @@
> 原文链接 https://medium.com/dartlang/dart-2-15-7e7a598e508a
Dart SDK 的 2.15 版本新增了**具备有更快并发能力的 isolates 、支持 tear-off 的构造函数 、关于 dart:core 库枚举支持的改进、包发布者相关的新功能**等等。
## isolates 的并发
如今的物理设备几乎都有多核的 CPU ,能够并行地执行多个任务,而对于大多数 Dart 程序而言,这些内核的使用过程对开发人员来说是透明的:
> 默认情况下 Dart 运行时所有 Dart 代码只会在单个内核上运行,但会使用其他内核来执行系统级任务,例如:异步的输入/输出、读写文件或者网络调用等。
但有时候 Dart 代码本身可能需要用到并发执行的场景,例如可能同时有“连续的动画和一个需要长时间运行的任务”,或者解析一个大型 JSON 文件等等场景。
如果附加需要执行的任务花费时间太长,可能就会导致 UI 卡顿或运行滞后,所以通过将这些额外的任务移动到另外一个单独的核心运行,保证动画可以继续在主执行线程上运行而不受干扰是必要的支持。
**Dart 的并发模型是基于[isolates](https://dart.dev/guides/language/concurrency)设计的——一种相互隔离的独立执行单元。这是为了防止在共享内存时,出现相关的并发编程错误问题**,例如[data races.](https://en.wikipedia.org/wiki/Race_condition#In_software)等。
Dart 通过不允许在 isolates 之间共享任何可变对象来防止这些错误,而是使用 [*消息传递*](https://dart.dev/guides/language/concurrency#sending-multiple-messages-between-isolates) 在 isolates 之间交换状态,**而如今在 Dart 2.15 中对 isolates 进行了许多实质性的改进。**
**Dart 2.15 重新设计和实现了 isolates 的工作方式,引入了一个新概念:*isolate groups* isolate groups 中的 isolate 共享正在运行的程序中的各种内部数据结构,这使得 groups 中的个体 isolates 变得更加轻便。**
> 如今在 isolate groups 中启动额外的 isolate 可以快近 100 倍,因为现在不需要初始化程序结构,并且产生新的 isolate 所需要的内存减少了 10-100 倍。
**虽然 isolate groups 还是不允许 isolate 之间共享可变对象,但该 group 可以通过共享堆来实现的,所以能够解锁更多功能**,比如可以将对象从一个 isolate 传递到另一 isolate这样就可以用于执行需要返回大量内存数据的任务。
> 例如通过网络调用获取数据,将该数据解析为一个大型 JSON 对象,然后将该 JSON 对象返回到主isolates。 在 Dart 2.15 之前执行该操作需要“深度复制”,如果复制花费的时间超过帧预算时间,就可能会导致 UI 卡顿。
**在 2.15 中工作的 isolates 可以调用 `Isolate.exit()` 将其结果作为参数传递**。将运行的 isolates 结果的内存传递给主 isolates ,而不是进行复制,主 isolates 可以在指定时间内接收结果。
这个行为在更新的[Flutter 2.8 中](https://medium.com/flutter/whats-new-in-flutter-2-8-d085b763d181) 的 [`compute()`](https://api.flutter.dev/flutter/foundation/compute-constant.html) 函数里,同样已经改变成这种实现, 如果你已经在使用 `Isolate.exit()``compute()` 函数,那么在升级到 Flutter 2.8 后将自动获得这些性能提升。
**最后 Dart 2.15 还重新设计了 isolates 消息传递机制的实现方式,使得中小型的消息传递速度提高了大约 8 倍**。另外扩展了 isolates 可以相互发送的对象种类,增加了对函数类型、闭包和堆栈跟踪对象的支持,有关详细信息,请参阅 API 文档 `SendPort.send()`
> 要了解有关如何使用隔离的更多信息,请参阅 2.15 添加的 [*Dart*](https://dart.dev/guides/language/concurrency) 文档中的[*并发介绍*](https://dart.dev/guides/language/concurrency) 另外还有许多[代码示例](https://github.com/dart-lang/samples/tree/master/isolates)可以查看。
## 新的语言特性:构造函数 tear-offs
在 Dart 中可以通过使用函数的名称创建一个函数对象,该对象指向另一个对象上的函数,如下代码所示,`main()` 方法的第二行声明了“将 `g` 设置为 `m.greet` ”的语法:
```dart
class Greeter {
final String name;
Greeter(this.name);
void greet(String who) {
print('$name says: Hello $who!');
}
}void main() {
final m = Greeter('Michael');
final g = m.greet; // g holds a function pointer to m.greet.
g('Leaf'); // Invokes and prints "Michael says: Hello Leaf!"
}
```
在使用 Dart core libraries 时,这种类函数指针(也称为函数 tear-offs经常出现如下是`foreach()` 通过传递函数指针来调用可迭代对象的示例:
```dart
final m = Greeter('Michael');['Lasse', 'Bob', 'Erik'].forEach(m.greet);// Prints "Michael says: Hello Lasse!", "Michael says: Hello Bob!",
// "Michael says: Hello Erik!"
```
在之前的版本中 Dart SDK 不支持从构造函数创建 tear-offs语言问题[#216](https://github.com/dart-lang/language/issues/216)),这就显得很烦人,因为在许多情况下,构建 Flutter UI 时构造函数 tear-offs 会是开发所需要的,所以从 Dart 2.15 开始支持这种语法。
如下是构建 `Column` 包含三个 `Text` Widget 的示例,通过调用 `.map()` 它并将其传递给`Text`
```dart
class FruitWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: ['Apple', 'Orange'].map(Text.new).toList());
}
}
```
**`Text.new` 指 `Text` 类的默认构造函数,还可以引用命名构造函数,例如: `.map(Text.rich)`**。
## Related language changes
当实现构造函数的 tear-offs 时Dart 2.15 借此机会修复了现有的函数指针支持中的一些不一致问题,现在可以专门化一个泛型方法来创建一个非泛型方法:
```dart
T id<T>(T value) => value;\
var intId = id<int>; // New in 2.15.\
int Function(int) intId = id; // Pre-2.15 workaround.
```
你甚至可以特化一个泛型函数对象来创建一个非泛型函数对象:
```dart
const fo = id; // Tear off `id`, creating a function object.\
const c1 = fo<int>; // New in 2.15; error before.
```
最后还清理了涉及泛型的类型文字:
```dart
var y = List; // Already supported.\
var z = List<int>; // New in 2.15.\
var z = typeOf<List<int>>(); // Pre-2.15 workaround.
```
## Improved enums in the dart:core library
Dart 2.15 为 `dart:core` 库([#1511](https://github.com/dart-lang/language/issues/1511))中的枚举 API 添加了更多的优化,现在开发者可以通过 `.name` 来获取每个枚举值的 `String` 值:
```dart
enum MyEnum {
one, two, three
}
void main() {
print(MyEnum.one.name); // Prints "one".
}
```
还可以按名称查找枚举值:
```dart
print(MyEnum.values.byName('two') == MyEnum.two); // Prints "true".
```
最后还可以获得所有名称-值对的映射:
```dart
final map = MyEnum.values.asNameMap();\
print(map['three'] == MyEnum.three); // Prints "true".
```
有关使用这些新 API 的示例可以参阅 [Flutter PR #94496](https://github.com/flutter/flutter/pull/94496/files)。
## Compressed pointers
Dart 2.15 添加了对 Compressed pointers 的支持,**如果只需要支持 32 位的地址空间(最多 4 GB 内存),则 64 位 SDK 可以使用更节省空间的指针表示形式**。
> 压缩指针导致显着的内存减少,在对 GPay 应用程序的内部测试中,我们看到 Dart 堆大小减少了大约 10%。
由于压缩指针意味着无法寻址 4 GB 以上的 RAM因此该功能位于 Dart SDK 中的配置选项之后,只能在构建 SDK 时由 Dart SDK 的嵌入器切换。
Flutter SDK 2.8 版已为 Android 构建中启用此配置Flutter 团队正在考虑在未来版本中[为 iOS](https://github.com/flutter/flutter/issues/94753) 构建启用此配置。
## Dart SDK 中包含 Dart DevTools
以前的 [DevTools](https://dart.dev/tools/dart-devtools#) 调试和性能工具[套件](https://dart.dev/tools/dart-devtools#) 不在 Dart SDK 中,所以开发者需要单独下载。
从 Dart 2.15 开始,现在可以在下载的 Dart SDK 里直接获取 DevTools而无需进一步的安装步骤。
有关将 DevTools 与 Dart 命令行应用结合使用的更多信息,请参阅 [DevTools 文档](https://dart.dev/tools/dart-devtools#using-devtools-with-a-command-line-app)。
## 包发布者的新 pub 功能
Dart 2.15 SDK 在 `dart pub` 开发者命令和[pub.dev](https://pub.dev/)包存储库中还有两个新的功能。
首先包发布者有了一个新的安全功能,目的是用于检测发布者在发布包中意外发布的机密(例如 Cloud 或 CI 凭据)。
在了解到 GitHub 存储库中[每天有数以千计的秘密被泄露](https://www.ndss-symposium.org/wp-content/uploads/2019/02/ndss2019_04B-3_Meli_paper.pdf)后Dart SDK 受到启发添加了此泄漏检测。
泄漏检测作为 `dart pub publish` 命令中预发布验证运行的一部分运行,如果它在即将发布的文件中检测到潜在的秘密,该 `publish` 命令将退出而不发布,并打印如下输出:
```
Publishing my_package 1.0.0 to [https://pub.dartlang.org](https://pub.dartlang.org/):\
Package validation found the following errors:\
* line 1, column 1 of lib/key.pem: Potential leak of Private Key detected.\
╷\
1 │ ┌ - - -BEGIN PRIVATE KEY - - -\
2 │ │ H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ\
3 │ └ - - -END PRIVATE KEY - - -\
╵\
* line 2, column 23 of lib/my_package.dart: Potential leak of Google OAuth Refresh Token detected.\
╷\
2 │ final refreshToken = "1//042ys8uoFwZrkCgYIARAAGAQSNwF-L9IrXmFYE-sfKefSpoCnyqEcsHX97Y90KY-p8TPYPPnY2IPgRXdy0QeVw7URuF5u9oUeIF0";
```
在极少数情况下此检测可能会出现误报,在这些情况下可以将文件添加到许可白名单。
> 白名单: https://dart.dev/go/false-secrets
其次还为发布者添加了另一个功能:**支持收回已发布的软件包版本。**
当发布了有问题的包版本时,通常建议是发布一个小增量的新版本,以修复意外问题。
在极少数情况下,例如当开发者还没有这样的修复能力时,或者是不小心发布了一个新的主要版本,就可以使用新的包收回功能作为最后的手段,此功能在 pub.dev 上的管理 UI 中可用:
![](http://img.cdn.guoshuyu.cn/20211223_Dart-215/image1)
当一个包版本被收回时pub 客户端不再为 `pub get` 或者 `pub upgrade` 解析那个版本,如果开发者使用了成功撤回的版本(因此在他们的`pubspec.lock`文件中),他们将在下次运行时看到警告`pub`
```
$ dart pub get\
Resolving dependencies…\
mypkg 0.0.181-buggy (retracted, 0.0.182-fixed available)\
Got dependencies!
```
## Security analysis for detecting bidirectional Unicode characters (CVE-202122567)
最近发现了一个涉及双向 Unicode 字符的通用编程语言漏洞 ( [CVE-202142574](https://nvd.nist.gov/vuln/detail/CVE-2021-42574) ),此漏洞影响大多数支持 Unicode 的现代编程语言,下面的 Dart 源代码演示了这个问题:
```dart
main() {
final accessLevel = 'user';
if (accessLevel == 'user .// Check if admin ') {
print('You are a regular user.');
} else {
print('You are an admin.');
}
}
```
你可能会认为该程序打印出 *`You are a regular user.`* ,但实际上它可能会打印 *`You are an admin`。*
通过使用包含双向 Unicode 字符的字符串,就可以利用此漏洞,例如上述都在一行中的这些字符,将文本的方向从左到右更改为从右到左和回退。
对于双向字符,文本在屏幕上的呈现与实际文本内容截然不同,开发者可以在[GitHub code gist](https://gist.github.com/mit-mit/7dda00ca6278ce7d2555f78d59d9e67b?h=1) 中看到这样的示例。
针对此漏洞的缓解措施包括使用检测双向 Unicode 字符的工具(编辑器、代码审查工具等)以便开发人员了解它们,并在知情的情况下接受它们的使用,上面链接的 GitHub gist 文件查看器是显示这些字符的工具的一个示例。
Dart 2.15 引入了进一步的缓解措施Dart 安全[公告 CVE-202122567](https://github.com/dart-lang/sdk/security/advisories/GHSA-8pcp-6qc9-rqmv)Dart 分析器现在扫描双向 Unicode 字符,并标记它们的任何使用:
```
$ dart analyze
Analyzing cvetest... 2.6sinfo • bin/cvetest.dart:4:27 • The Unicode code point 'U+202E'
changes the appearance of text from how it's interpreted
by the compiler. Try removing the code point or using the
Unicode escape sequence '\u202E'. •
text_direction_code_point_in_literal
```
我们建议用 Unicode 转义序列替换这些字符,让它们在任何文本编辑器或查看器中可见,或者如果开发者觉得确实合法使用了这些字符,则可以通过在使用前的行中添加覆盖来禁用警告:
```
// 忽略text_direction_code_point_in_literal
```
## Pub.dev credentials vulnerability when using third-party pub servers (CVE-202122568)
Dart 2.15 还发布了第二个与 pub.dev 相关的 Dart 安全[公告 CVE-202122568](https://github.com/dart-lang/sdk/security/advisories/GHSA-r32f-vhjp-qhj7)。
> 此公告面向可能涉及已将包发布到第三方发布包服务器(例如私人或公司内部包服务器)的包发布者,仅发布到公共 pub.dev 存储库(标准配置)的开发人员不受此漏洞的影响。
如果开发者已发布到第三方存储库,则该漏洞是在该第三方存储库中提供用于身份验证的 OAuth2 临时(一小时)访问令牌,可能会被滥用来针对公共 pub.dev 存储库进行身份验证。
因此恶意的第三方 pub 服务器可能会使用访问令牌在 pub.dev 上冒充开发者并在那里发布包。
如果开发者已将软件包发布到不受信任的第三方软件包存储库,请考虑对 pub.dev 公共软件包存储库中的所有帐户活动进行审核,[推荐可以使用 pub.dev 的活动日志](https://pub.dev/my-activity-log)。

View File

@ -2,3 +2,60 @@
### 作为对 Flutter 系列额外的补充,不定时给你带来有趣的文章。
* [Flutter 跨平台框架应用实战-2019极光开发者大会](Flutter-jg-meet.md)
* [Flutter 面试知识点集锦](Flutter-msjj.md)
* [全网最全 Flutter 与 ReactNative深入对比分析](qwzqdb.md)
* [Flutter 开发实战与前景展望 - RTC Dev Meetup](Flutter-rtc-meetup.md)
* [Flutter Interact 的 Flutter 1.12 大进化和回顾](Flutter-Interact-2019.md)
* [Flutter 升级 1.12 适配教程](Flutter-update-1.12.md)
* [Spuernova 是如何提升 Flutter 的生产力](Flutter-Supernova.md)
* [Flutter 中的图文混排与原理解析](Flutter-TWHP.md)
* [Flutter 实现视频全屏播放逻辑及解析](Flutter-Player-Full.md)
* [Flutter 上的一个 Bug 带你了解键盘与路由的另类知识点](Flutter-keyboard-rs.md)
* [Flutter 上默认的文本和字体知识点](Flutter-Font-Other.md)
* [带你深入理解 Flutter 中的字体“冷”知识](Flutter-Font-Cool.md)
* [Flutter 1.17 中的导航解密和性能提升](Flutter-nav+1_17.md)
* [Flutter 1.17 对列表图片的优化解析](Flutter-Image+1_17.md)
* [Flutter 1.20 下的 Hybrid Composition 深度解析](flutter-hy-composition.md)
* [2020 腾讯Techo Park - Flutter与大前端的革命](Flutter-TECHO.md)
* [带你全面了解 Flutter它好在哪里它的坑在哪里 应该怎么学?](Flutter-WHAT.md)
* [Flutter 中键盘弹起时Scaffold 发生了什么变化](Flutter-KEY.md)
* [Flutter 2.0 下混合开发浅析](Flutter-Group.md)
* [Flutter 搭建 iOS 命令行服务打包发布全保姆式流程](Flutter-iOS-Build.md)
* [不一样角度带你了解 Flutter 中的滑动列表实现](Flutter-N-Scroll.md)
* [带你深入 Dart 解析一个有趣的引用和编译实验](DEMO-INTEREST.md)
* [Dart 里的类型系统](Dart-SYS.md)
* [Dart VM 的相关简介与运行模式解析](Dart-VM.md)
* [Flutter 里的语法糖解析,知其所然方能潇洒舞剑](Flutter-SU.md)
* [Flutter 实现完美的双向聊天列表效果,滑动列表的知识点](Flutter-SC.md)
* [Flutter 启动页的前世今生适配历程](Flutter-LA.md)
* [Flutter 快速解析 TextField 的内部原理](Flutter-TE.md)

208
Flutter-112.md Normal file
View File

@ -0,0 +1,208 @@
昨天谷歌为在 `Flutter Interact` 上为我们带来了 `Flutter 1.12` ,这是 1.9.x 的版本在经历 6 次 `hotfix` 之后,才带来的 stable 大版本更新。**该版本解决了 4,571 个报错,合并了 1,905 份 pr同时本次发布也是 Flutter 一年内的第五个稳定版本。**
结合本次 `Flutter Interact` ,可以总结出几个关键词是: **`Platform``DartPad` 、`Spuernova` 、`AdobeXD`、`Hot UI` 和 `Layout Explorer` 。**
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image1)
## 一、更多的平台
本次 `Flutter Interact` 提出了让开发者更聚焦于精美的应用开发,从**以设备为中心转变为以应用为中心的开发理念**Flutter 将帮助开发者忽略 Android、iOS、Web、PC 等不同平台差异,如下图所示是现场一套代码同时调试 7 台设备的演示。
本次 Flutter 也开始兑现当初的承诺,目前 **Web 的支持已经发布到 Beta 分支,而 MacOS 的支持已经发布到 Master** 分支。虽然进度不算快,但是作为“白嫖党”表示还是很开心能看到有所推进。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image2)
使用 `Flutter Web``Flutter MacOS` 需要通过如下命令行打开配置,并且执行 `flutter create xxxx` 就可以创建带有 Web 和 MacOS 的项目(如果已有项目也可以执行 `flutter create` 补全),并且需要注意**调试 MacOS 平台应用需要本地 Flutter SDK 要处于 `master` 分支,如果仅测试 Web 可以使用 `beta` 分支。**
```
flutter config --enable-macos-desktop
flutter config --enable-web
///其他平台的支持
flutter config --enable-linux-desktop
flutter config --enable-windows-desktop
```
最后可以通过 `run` 或者 `build` 命令运行和打包程序,同时需要注意这里提到的 `linux``window` 平台目前还未合并到主项目中,如果想测试可在 [Desktop-shells](https://github.com/flutter/flutter/wiki/Desktop-shells) 查看对应配置项目:[flutter-desktop-embedding](https://github.com/google/flutter-desktop-embedding)。
```
///调试运行
flutter run -d chrome
flutter run -d macOS
///打包
flutter build web
flutter build macos
```
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image3)
## 二、更多开发工具
### 1、DartPad
`DartPad` 是用于在线体验 Dart 功能的平台,而本次更新后 `DartPad` 也支持 Flutter 的在线编写预览,这代表着开发者可以在没有 `idea` 的情况下也能实时测试自己的 Flutter 代码,算是补全了 Flutter 的在线用例测试。
> DartPad 的官方地址:[dartpad.dev](https://dartpad.dev) 和国内镜像地址 [ dartpad.cn](https://dartpad.cn)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image4)
### 2、Spuernova
[`Spuernova`](https://supernova.io) 可以说是本次 `Flutter Interact` 的亮点之一,通过导入设计师的 `Sketch` 文件就可以生成 Flutter 代码,这无疑提升了 Flutter 的生产力和可想象空间,**虽然这种生成代码的方法并不罕见,完整实用程度有待考验,但是这也让开发者可以更聚焦于业务逻辑和操作逻辑。**
> 放心,这个坑不是谷歌 Flutter 团队开的,它属于另外一家商业公司。
使用 `Spuernova` 可以从 [https://supernova.io](https://supernova.io) 下载 `Supernova Studio` 之后需要注册用户信息可能需要科学S网最后就可以看到如下图所示的界面。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image5)
在导入 `Sketch` 文件后可以看到设计师完成的界面效果,同时选中 `"</>"` 按键,可以在右侧看到对应的 Flutter 代码,左侧可以看到对应的层级设计,但是这时候的代码看起来还比较简单和笨重,并且不具备交互能力。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image6)
如果进一步配置,用户需要在对应的控件上,使用右键的弹出框配置控件的功能,比如 `List`、`Button`、`TextField` 等组件去 Convert 原有的控件,让控件更新具备交互能力,同时还可以为控件配置布局属性和动画效果等。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image7)
当然, `Spuernova` 并不是什么完全的公益项目,目前只有对于 Flutter 的简单支持上是免费的,其他项目支持还是处于收费状态。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image8)
另外类似的还有 `AdobeXD` Adobe 的 Creative Cloud 添加了 Flutter 支持,只需一个插件,用户就可以将 `AdobeXD` 导出到 Flutter目前处于[注册参加优先体验计划](https://xd.adobelanding.com/xd-to-flutter) 的进度。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image9)
### 3、Hot UI
Hot UI 就是大家盼星盼月的预览功能,如下图所示,在 Android Studio 的 Flutter 插件中在开发 widget 开发的过程中,直接在 IDE 的镜像里进行预览并与之进行交互。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image10)
在官方的 [HotUI-Getting-Started-instructions](https://github.com/flutter/flutter-intellij/wiki/HotUI-Getting-Started-instructions) 中可以看到相关的描述:**This feature is currently experimental. To enable, go to Preferences > Languages & Frameworks > Flutter Then check "Enable Hot UI" under "Experiments".** 目前该功能还处于实验阶段,在 Android Studio 的设置中,如图所示底部勾选启动这个功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image11)
但是如下图所示,开启后会发现和官方宣传的不一样?因为目前预览的 `Screen mirror` 处于 `coming soon` 的状态。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image12)
现阶段的 Hot UI 如下 GIF 所示,暂时只支持用户动态调试和配置控件的属性等逻辑,让我们期待官方填坑吧。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image13)
### 4、Layout Explorer
[`Layout Explorer`](https://flutter.dev/docs/development/tools/devtools/inspector#flutter-layout-explorer) 是另外实验性的布局调试模式,`Layout Explorer` 主要是用于帮助开发者更直观地适配屏幕和调试如 `overflowed` 等场景的问题。
在最新的 `Dart DevTools` 工具添加了一个名为 `Layout Explorer` 的功能,它能够以可视化的方式呈现应用的布局信息,从而让检查器可以更好地发挥功,同时 `Layout Explorer` 不仅能以可视化的方式展现正在运行的应用中的 widget 布局,而且还允许以交互的方式更改布局选项。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image14)
启动 `Layout Explorer` 同样需要 Flutter SDK 处于 `master` 分支,然后在程序运行之后,点击 `DevTools` 在 chrome 打开,之后点击最右侧的按键进入 Flutter 调试模式。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image15)
如下 GIF 所示,当选中的控件是具备 `Flex` 的支持时,可以看到有 `Layout Explorer` 的面板,在面板中可以动态调整控件的显示逻辑和控件的布局情况。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image16)
比如当控件出现了 `overflowed` ,我们可以很直观的看到问题的根源并且进行调整。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image17)
另外可以在 `Layout Explorer` 中动态调整控件的 flex 等相关信息,实时预览修改情况。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image18)
## 三、Flutter SDK 改进
Flutter SDK 相关的更新本次解决了 4,571 个报错,合并了 1,905 份 pr同时包含了许多的新功能支持。
- 首先 Flutter 1.12 建议开发者将 Android 项目迁移到 AndroidXSDK 的瘦身,增加了 [google_fonts](https://pub.flutter-io.cn/packages/google_fonts) 字体的支持等。
- Android 插件的改进 [Android plugins APIs](https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration),相比起以前更为简单明了,分割了 `FlutterPlugin` and `MethodCallHandler` ,同时提供 `ActivityAware``ServiceAware` 作为独立支持。
- iOS 13 深色模式,支持使用 darkTheme 设置,同时还增加了如 `CupertinoContextMenu`、`CupertinoSlidingSegmentedControl`、`CupertinoAlertDialog`、`CupertinoDatePicker` 等 iOS 风格的控件支持。
```
new MaterialApp(
title: '',
navigatorKey: navigatorKey,
theme: model.themeData,
darkTheme: model.darkthemeData,
locale: model.locale,
```
- [Add-to-App](https://flutter.dev/docs/development/add-to-app) 混合集成模式的进一步的更新。
- 新增加了不兼容的 `breaking change`,比如: [PageView 启用 RenderSliverFillViewport](https://github.com/flutter/flutter/pull/37024) 、 [WidgetsBinding 中的 attachRootWidget 被替换为 scheduleAttachRootWidget](https://github.com/flutter/flutter/pull/39079/files) 、[Allow gaps in the initial route](https://github.com/flutter/flutter/pull/39440/files)、[TextField's minimum height from 40 to 48 ](https://github.com/flutter/flutter/pull/42449) 等需要开发者注意重新适配的修改,更多可查阅 [release-notes-1.12.13](https://flutter.dev/docs/development/tools/sdk/release-notes/release-notes-1.12.13)。
- 增加了 [MediaQuery.systemGestureInsets 支持 Android Q 的手势导航](https://github.com/flutter/flutter/pull/37416);增加了 SliverIgnorePointer 、SliverOpacity、SliverAnimatedList 等控件支持PageRouteBuilder 支持 fullscreenDialog。
- [Dart 2.7 的发布,支持扩展方法](https://medium.com/dartlang/dart-2-7-a3710ec54e97)。
```
extension ExtendsFun on String {
int parseInt() {
return int.parse(this);
} double parseDouble() {
return double.parse(this);
}
}
main() {
int i = '42'.parseInt();
print(i);
}
```
更多完整的 release-notes 可见 [release-notes-1.12.13](https://flutter.dev/docs/development/tools/sdk/release-notes/release-notes-1.12.13)
### 四、其他
本次 `Flutter Interact` 还推荐了 [flutter-d-art](https://github.com/Solido/flutter-d-art) 和
[gskinner](https://flutter.gskinner.com) 等精美的开源项目,同时
**Flutter 本次也表示了将在未来优化代码的开发模式,而 Flutter 在不断开新坑的同时,也需要面对目前层出的问题。**
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image19)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image20)
Flutter 过去的一年无疑是火热的,所以暴露的问题也指数级出现,比如最近开发中就遇到了**在断网时加载图后之后,再打开网络无法继续显示图片的问题。**
不过既然是开源项目,“白嫖”之余也得多靠自己,上述问题经过查找后,在自定义的 `ImageProvider` 里图片加载失败时,可以通过清除了 `ImageCache` 中的 `PendingImage` 来解决问题,同时因为 `Image` 的封装与 `DecorationImage` 的差异化,还需要对 `Image``didUpdateWidget` 做二次处理才解决了问题。
说这个问题其实就是想表达开源的意义,用一个框架不能够只是坐享其成的心态,开源的目的更是交流,不管什么框架都不可能尽善尽美,我们可以用更开放的心态去尝试和“批判”,而我们的岗位不就是解决这些问题的么?
### Flutter 文章汇总地址:
> [Flutter 完整实战实战系列文章专栏](https://juejin.im/collection/6845243771605499912)
>
> [Flutter 番外的世界系列文章专栏](https://juejin.im/collection/6845244058865139726)
### 资源推荐
* Github https://github.com/CarGuo
* **开源 Flutter 完整项目https://github.com/CarGuo/GSYGithubAppFlutter**
* **开源 Flutter 多案例学习型项目: https://github.com/CarGuo/GSYFlutterDemo**
* **开源 Fluttre 实战电子书项目https://github.com/CarGuo/GSYFlutterBook**
* 开源 React Native 项目https://github.com/CarGuo/GSYGithubApp
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-112/image21)

213
Flutter-117.md Normal file
View File

@ -0,0 +1,213 @@
2020年5月6日Flutter终于迎来的本年的第一个稳定版本`1.17.0`距离上一个稳定版本的发布已经过去了将近5个月146天。受到世界范围的~~你我都知道的情况~~影响今年的Google I/O也被取消一定程度影响了本次版本的发布。同时在临近发布前出现了具有严重影响的BUG也导致发布时间再次被推迟。
  那么`1.17.0`到底更新了什么?是不是能再一次颠覆使用体验?能否让开发者再次真香?以下通过**对Medium原文进行部分总结翻译以及补充**,为各位进行解答~(如有错漏欢迎指出)(有英文原文没有的内容噢😉)
## 写在前面
本次Flutter版本的发布开发团队将更多的时间用于[构建新的发布流程架构](https://link.juejin.cn/?target=https%3A%2F%2Fmedium.com%2Fp%2Ff723d898d7af)。自上一次发布稳定版本以来,已解决了**6339个问题issue**,分别从**231位开源贡献者**合并了[**3164个提交请求**](https://link.juejin.cn/?target=https%3A%2F%2Fflutter.dev%2Fdocs%2Fdevelopment%2Ftools%2Fsdk%2Frelease-notes%2Fchangelogs%2Fchangelog-1.17.0)。得益[*NeverCode*与团队的合作](https://link.juejin.cn/?target=https%3A%2F%2Fblog.codemagic.io%2Fflutter-and-codemagic-join-forces-on-github%2F)今年团队在Flutter的仓库上关闭的issue比新增的issue更多总数减少了**约800个**。与Flutter一同发布的还有Dart 2.8、iOS新增Metal渲染支持、新的Meterial组件和新的网络追踪调试工具等。
## 移动端性能及应用大小优化
  性能及内存优化的工作是这次新版本的重点。升级到新版本后,用户将立刻感受到更流畅快速的动画、更小的应用大小以及更低的内存占用。现在一般的路由变换场景(非透明的路由过渡)将[提速20%-37%](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F48900)。根据不同设备硬件性能的不同在简单的iOS动画上能减少最多40%的CPU/GPU使用率[engine#14104](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fengine%2Fpull%2F14104) / [engine#13976](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fengine%2Fpull%2F13976))。
  该版本还包含了大量的应用大小优化。例如官方的展示应用*Flutter Gallery*的Android应用包大小从9.6MB减小到了8.1MB18.5%)。
另外在内存使用率方面带有图片的列表在快速滚动时造成的内存占用及波动一直是Flutter的痛点之一。该版本将快速滚动带图片大图列表场景的[内存使用率降低了70%](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fengine%2Fpull%2F14265)。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image1)
最值得说明的性能强力提升是对iOS Metal的支持。
## Metal的支持为iOS应用带来了50%的性能提升
[Metal](https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.apple.com%2Fmetal%2F)是与iOS 8一同发布的API具有兼顾图形与计算功能、面向底层、低开销的硬件加速[4]等优势。Flutter现已默认使用Metal让用户应用的平均渲染速度加快了50%*(由实际业务决定)*。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image2)
而在不支持Metal的设备上A7处理器及iOS 10以下Flutter将继续使用OpenGL进行渲染。
## Material部件`NavigationRail`、`DatePicker`、`VisualDensity`及更多
Flutter团队正在持续地根据客户的反馈推进Flutter中Material Design的实现。本次由Material Design团队设计并实现了一个用于响应式App布局的路由组件`NavigationRail`,该组件能与`BottomNavigator`快速转换,在设备尺寸变大时随之改变,能很好地适应移动端与桌面版的布局。
*快速体验 `NavigationRail` 可以访问 [demo](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fsamples%2Ftree%2Fmaster%2Fexperimental%2Fweb_dashboard) 或在 [dartpad](https://link.juejin.cn/?target=https%3A%2F%2Fdartpad.dev%2Fb9c6cd345fd1cff643353c1f4902f888) 上进行尝试。*
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image3)
此外基于Material Design的日期选择器`DatePicker`也已一同发布。新的`DatePicker`使用了符合Material指导的视觉效果通过[详情文章](https://link.juejin.cn/?target=https%3A%2F%2Fflutter.dev%2Fgo%2Fmaterial-date-picker-redesign)可以了解到更多。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image4)
`VisualDensity`也是新引入的内容其指代的是Material Design中各类组件的视觉密度。通过调整它可以使得标准Material组件之间更加紧凑或疏远。新版本在`ThemeData`中引入了设置(`ThemeData.visualDensity`)。详细介绍请移步[文档](https://link.juejin.cn/?target=https%3A%2F%2Fapi.flutter.dev%2Fflutter%2Fmaterial%2FVisualDensity-class.html)。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image5)
  文字选择菜单也已针对平台做了相应的改进。现在菜单内的选项超出屏幕宽度时将会自动收起并可以通过与原生一致的操作切换,解决了某些语言中操作项的文字过长时布局溢出的问题。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image6)
*Android平台的文本选择*
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image7)
*iOS平台的文本选择*
与1.17一起Flutter团队一同发布了基于[Material 运动系统](https://link.juejin.cn/?target=https%3A%2F%2Fmaterial.io%2Fdesign%2Fmotion%2Fthe-motion-system.html)的预设[动画组件包](https://link.juejin.cn/?target=https%3A%2F%2Fpub.dev%2Fpackages%2Fanimations)。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image8)
在Material的[运动系统介绍文章](https://link.juejin.cn/?target=https%3A%2F%2Fmedium.com%2Fgoogle-design%2Fimplementing-motion-9f2839002016)中Material Design团队定义了从组件到全屏视图的四种动画变化类型容器转换、共轴转换、交叉渐变、渐变。尽管Flutter原本就可以实现对应效果但该动画组件包能让开发者更轻松地实现它们。
## Material文本更现代化的Flutter文字主题
在该版本的发布中Flutter团队在兼容以前版本的App的前提下完整整合了2018标准的Material Design文本大小定义。原有的`TextTheme` API使用未受影响但现在被标记为**废弃**,提醒开发者尽快迁移到新的标准。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image9)
在Flutter的`TextTheme`中,`bodyText1`和`bodyText2`对应着Material Design的`body1`和`body2`。类似的还有`H1-H6`,对应`headline1-headline6`。
## 用于Flutter的谷歌字体
如果你对新的Material Design文字缩放感兴趣那么相信你对在Flutter中使用[`GoogleFonts`](https://link.juejin.cn/?target=https%3A%2F%2Fmedium.com%2Fflutter%2Fintroducing-google-fonts-for-flutter-v-1-0-0-c0e993617118)也抱有非常大的期待。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image10)
`GoogleFonts`让开发者能轻易地在开发的App中体验和使用`fonts.google.com`上的所有字体开发者可以选择让用户直接通过API下载字体或在应用中内置提供这些字体。
## 辅助功能和国际化  
Flutter团队持续关注的另一个方向便是辅助功能它将让Flutter应用的应用范围更加广泛并且为特定场景增加了可用性。在该版本中针对[滑动](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fissues%2F43883)、[文字](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fissues%2F52487)、[输入框](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fissues%2F53065)及[其他输入组件](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fissues%2F49259)修复了[大量问题](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fissues%3Fq%3Dis%3Aclosed%2Bis%3Aissue%2Blabel%3A%22a%3A%2Baccessibility%22%2Bclosed%3A2019-11-25..2020-04-02)。官方推荐开发者根据文档中更新的[**最佳实践**](https://link.juejin.cn/?target=https%3A%2F%2Fflutter.dev%2Fdocs%2Fdevelopment%2Faccessibility-and-localization%2Faccessibility)去测试自己的应用。
  在国际化方面,团队针对三星输入法对许多东亚语言的影响完成了修复。思密达开发者们应该会庆祝这些改动🤣
## 工具整合Flutter的Dart DevTools、Android快速启动应用调试及更多
该版本的发布伴随着即将发布的与Flutter进行整合的Dart DevTools如果你想立刻尝试它请启动DevTools并点击右上角的"beaker"图标。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image11)
在预发布的DevTools中你会看到多项优化点但最重要的一项便是`Network` **网络**)选项卡。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image12)
网络选项卡现在可以查看来自应用的网路请求方便快速地排查请求问题。如果开发者在DevTools中没有找到该选项卡可以通过以下命令来进行升级或启用
```
$ pub global actiat devtools
复制代码
```
  默认情况下,网络选项卡会在你点击"Record"开始记录后显示你的网络活动但如果开发者希望从App启动开始时就记录可以在`main()`入口中使用以下方法:
```
void main() {
// 启用网络请求输出
HttpClient.enableTimelineLogging = true;
runApp(MyApp());
}
复制代码
```
新的DevTools带来了另一项实验性功能[安卓“快速启动”](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F46140)让开发者开启调试的速度加快70%。这项功能可以通过`flutter run --fast-start -d <your Android Device>`开启。使用功能时一个仅基于平台代码、不含dart代码和资源变动的“壳”APK包将被安装到设备上。由于修改dart代码或资源并不需要APK重新构建这会让`flutter run`更快地启动。与传统的启动模式不同,这个功能会将你的代码包装在一个壳中运行。在某些情况下这项功能将无法生效,例如在应用使用了原生插件调用了方法。
从该版本起创建新的Flutter应用时将仅允许创建使用AndroidX的应用。团队已将所有的support API标记为废弃在创建新项目时`--android`参数是唯一有用的参数。虽然support版本的应用仍然能正常打包但此时不[迁移](https://link.juejin.cn/?target=https%3A%2F%2Fflutter.dev%2Fdocs%2Fdevelopment%2Fandroidx-migration)更待何时?
如果开发者是Android Studio或者IntelliJ用户会发现热重载变得更为灵活了。在以前当分析器认为代码中存在错误error将阻止开发者热重载。当这些错误并不对你当前正在开发或调试的功能造成影响时会让你花费更多的时间去处理这些错误让人恼火。自此分析器不再有权利阻止热重载的进程而交给VM编译过程来进行判断。
这些改动都发布在了对应的dev分支如果开发者想尽快参与到其中可以通过[此处](https://link.juejin.cn/?target=https%3A%2F%2Fgroups.google.com%2Fforum%2Fm%2F%23!topic%2Fflutter-announce%2FtTgQcTgqrKg)报名。通过参与新版本的测试更频繁的更新与Flutter团队反馈使用感想将让编译器插件更加健壮。
对于VS Code开发者团队推荐一项新的功能**Dart: List Outdated Packages`pub outdated`**。它可以帮助开发者排查依赖版本不匹配导致的问题。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image13)
最后如果开发者碰到了Flutter crash工具将引导开发者以正确的方式上报异常Flutter团队会密切关注这类错误的严重程度和频率。
![img](http://img.cdn.guoshuyu.cn/20211223_Flutter-117/image14)
## 不兼容的改动
该版本中包含以下重大不兼容API改动
- [#42100](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F42100) [使用pushReplacement时调用secondaryAnimation](https://link.juejin.cn/?target=https%3A%2F%2Fgroups.google.com%2Fg%2Fflutter-announce%2Fc%2Fy0SvesRHlcE%2Fm%2F39TuR5FVDQAJ)
- [#44930](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F44930) Navigator 2.0 命令式API改动
- [#45940](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F45940) 废弃UpdateLiveRegionEvent
- [#49389](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F49389) 延迟快速滚动时的图像解码
- [#49391](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F49391) Android文本选择溢出
- [#49771](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F49771) [不对空Painter设置cache断言](https://link.juejin.cn/?target=https%3A%2F%2Fgroups.google.com%2Fg%2Fflutter-announce%2Fc%2FgDfazJIBdDo%2Fm%2Fd5AC8gR3FQAJ)
- [#50318](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F50318) [实时的图片缓存](https://link.juejin.cn/?target=https%3A%2F%2Fgroups.google.com%2Fg%2Fflutter-announce%2Fc%2FIdfjYvRBR4c%2Fm%2F1_JxffXTGAAJ)
- [#50354](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F50354) [使用strut box高度计算矩形以确保它们在可见范围内](https://link.juejin.cn/?target=https%3A%2F%2Fgroups.google.com%2Fg%2Fflutter-announce%2Fc%2FhVP699NQ7PQ%2Fm%2FBgVgmsAdFwAJ)
- [#50733](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F50733) 为gen_I10n生成信息查询
- [#51435](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F51435) 从`RouteSettings`中移除`isInitialRoute`
- [#52781](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fflutter%2Fflutter%2Fpull%2F52781) 将`mouse_tracking.dart`移动至rendering
##
作者AlexV525
链接https://juejin.cn/post/6844904150182920199
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

200
Flutter-120.md Normal file
View File

@ -0,0 +1,200 @@
> 原文链接https://medium.com/flutter/announcing-flutter-1-20-2aaf68c89c75
谷歌对 Flutter 的定位是提供一个便捷的工具包,从而在任何设备上得到出色的绘制体验,所以对于每个 release 版本,将会努力确保 Flutter 能**快速,美观,高效和开放**地支持每个平台,而在今天发布到 release 分支的 1.20 版本中,主要也是关于以上这四个方面的改进。
在**快速**这个类别中,从底层级别的渲染引擎到 Dart 语言本身,本次我们都实现了多项性能改进。
为了使开发者能够构建更加**精美**的 Flutter 应用程序1.20 版本提供了多项 UI 增强功能,包括期待已久的:
- `autofill` 支持;
- 对 `Widget` 进行分层以支持平移和缩放的新方式;
- 新的鼠标光标支持;
- 对旧版本的 `Material Widget`(例如时间和日期选择器),以及 desktop 和 mobile 上 Flutter 应用中 About box 的全新响应式 license 页面的更新。
为了继续提高 Flutter 的工作**效率**,我们对 `Visual Studio Code` 的 Flutter 扩展进行了更新,该扩展将 `Dart DevTools` 直接带入的 IDE 中,在移动文件时会自动更新了导入语句,并提供了一组新的元数据用于构建自己的工具。
由于 Flutter 的**开放**性和出色的社区贡献者,本 stable 版包含来自全球 `359` 个贡献者的 `3,029` 个合并 **PR**`5,485`**closed issues**,其中包括来自 Flutter 社区的 `270` 个贡献者。
实际上,这是 Flutter release 版本中包含的最多社区贡献,特别是向这些社区贡献者表示感谢:
- CareF 的 28个 PR
- AyushBherwani1998 的 26个PR包括 10 个 Flutter samples 作为他的 Google Summer of Code 项目的一部分);
- a14n 的 13个PR其中许多用于为 Flutter 的 landing null safety
如果没有广泛的社区贡献者团队,我们将无法持续发布 Flutter所以非常感谢大家的支持
Flutter 的每个新版本都会带来了更多使用的动力,实际上在 4月就有报道过 Google Play 商店中的 Flutter 应用程序数量已达到 `50,000`,每月峰值新应用程序数量为 `10,000`
现在仅三个月后Google Play 中就已经有超过 `90,000` 个Flutter应用我们在印度看到了很多这种增长现在印度是 Flutter 开发人员的第一大区域在过去六个月中翻了一番这与Google 在该地区增加的投资相吻合。最后 Flutter 不能没有 Dart ,因此很高兴看到 IEEE 报告说 Dart 自去年以来已经上升了 4 个排位,在他们跟踪的前 50 种语言中排名第 12。
## Flutter 和 Dart 的性能改进
在 Flutter 团队中,我们一直在寻找减少应用程序大小和延迟的新方法。以上一个版本为示例,此版本**修复了 [icon font tree shaking 时的工具性能问题](https://github.com/flutter/flutter/pull/55417)[并在构建非 Web 应用程序时font tree shaking 为默认行为](https://github.com/flutter/flutter/pull/56633)**。
icon font tree shaking 会删除未在应用程序中使用的图标从而减小尺寸。将其用于Flutter Gallery 应用程序时我们发现它使应用程序大小减少了100kb。现在在进行 release 版本构建时,默认情况下在移动应用程序中会出现这个行为,目前仅限 `TrueType` 字体,但在将来的版本中将取消该限制。
我们在此版本中进行的另一项性能改进是**使用预热阶段来减少动画初始显示中的锯齿**,可以在此动画中看到一个改进的示例(降低到一半速度)。
![不用和有SkSL预热的动画](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image1)
如果 Flutter 应用程序在首次运行期间出现了不稳定的动画,则 Skia Shading Language 着色器将在应用程序构建过程中提供预编译功能,从而可以使其速度提高 2 倍以上。如果想利用此高级功能,请参见 flutter.dev 上的 [SkSL 预热页面](https://flutter.dev/docs/perf/rendering/shader)。
最后,当我们针对 desktop 进行优化时,我们将继续完善对鼠标的支持。在此版本中,我们重构了鼠标点击测试系统,以提供由于性能问题而被阻止的许多体系结构优势,重构使我们能够在基于 Web 的微基准测试中将性能提高多达 `15` 倍!这意味着开发者将获得更好,更一致,更准确的命中测试,而无需放弃性能:双赢!
通过这种更好,更快,更强大的鼠标命中测试,我们增加了对鼠标光标的支持,这是 desktop 最受欢迎的功能之一。默认情况下,几个常用的小部件将显示开发者期望的光标,或者开发者可以从受支持的光标列表中指定另一个。
![Android上现有小部件上的新鼠标光标](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image2)
此版本的 Flutter 基于 2.9 版本的 Dart 构建的,它具有一个新的基于状态的 `two-pas UTF-8 `解码器,该解码器具有在 Dart VM 中优化的解码原语,部分利用了 `SIMD` 指令。UTF-8是迄今为止互联网上使用最广泛的字符编码方法当收到较大的网络响应时能够快速对其进行解码至关重要。在我们的UTF-8解码基准测试中我们发现在低端ARM设备上英语文本的全面改进从近200提高到中文文本的400
## 自动填充移动文本字段
一段时间以来,最受用户欢迎的功能之一是为 Flutter 程序中对文本自动填充在 Android 和 iOS提供支持。使用 [PR 52126](https://github.com/flutter/flutter/pull/52126),我们很高兴地说等待已经结束:不再要求用户重新输入,操作系统已为他们收集的数据。
![自动填充](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image3)
另外你会很高兴听到我们也已经开始为 Web 添加此功能。
## 一个用于常见交互模式的新控件
此版本引入了一个新的小部件 `InteractiveViewer`。该 `InteractiveViewer` 设计用于建设普通类型的交互性到应用程序,如: 平移缩放和拖动“N”下降甚至大小调整其中类似这种[简单的棋盘](https://github.com/justinmc/flutter-go)。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image4)
要查看如何将集成 `InteractiveViewer` 到自己的应用程序中,请查看[API文档](https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html),你可以在 DartPad 中使用它。另外,如果你想了解的 `InteractiveViewer` 设计和开发方法则可以在YouTube 上看到 [Chicago Flutter on YouTube.](https://www.youtube.com/watch?v=ChFa0A72Uto)的演讲。
如果你有兴趣向 `InteractiveViewer` 启用的 Flutter 应用程序中添加新的交互那么你可能也会很高兴听到我们在此版本中添加了更多功能来拖动“n”。具体来说如果你想准确知道目标控件上的放置发生在哪里Draggable对象本身始终可以使用它现在可以使用 `DragTarget onAcceptDetails` 方法获取该信息。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image5)
请查看此样本以获取详细信息,并期待将来的发行版,该发行版还将在拖动期间提供此信息,以便`DragTarget` 可以在拖动操作期间更轻松地提供视觉更新。
## 更新了 Material SliderRangeSliderTimePicker 和 DatePicker
除了新的控件之外,此版本还包含许多更新的控件,包括 `Slider``RangeSlider`。有关更多信息,请参见 `Slider` 控件的新增功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image6)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image7)
`DatePicker` 已更新,包括新的紧凑型设计以及对日期范围的支持。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image8)
最后TimePicker它具有全新的风格。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image9)
如果您想使用它,这是一个使用 [Flutter构建的有趣的 Web 演示](https://flutter-time-picker.firebaseapp.com/#/)。
### Responsive Licenses page
此版本的另一个更新是可以从中获得新的 esponsive licenses page: `AboutDialog`
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image10)
来自社区贡献者 TonicArtos 的 [PR 57588](https://github.com/flutter/flutter/pull/57588) 不仅进行了更新,以符合 Material 准则,使其看起来非常美观,而且更易于浏览,并设计为可在平板电脑和台式机上以及在手机上正常使用。谢谢 TonicArtos由于每个 Flutter 应用程序都应显示其使用的软件包的许可证,因此使每个 Flutter 应用程序都变得更好了。
## 发布插件需要新的 pubspec.yaml 格式
当然Flutter不仅是控件它也是工具此版本附带太多更新但是这里有一些亮点。
首先,是一项公共服务公告:如果您是 Flutter 插件的作者,那么 `pubspec.yaml` 发布插件将不再支持旧格式。如果尝试执行 `pub publish` 时会收到以下错误消息:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image11)
旧格式不支持指定插件支持的平台,并且自 Flutter 1.12 起已弃用。现在,发布新的或更新的插件需要新的 `pubspec.yaml` 格式。
对于插件客户而言,这些工具仍然可以理解旧的 `pubspec` 格式,在未来一段时间内 `pub.dev`上所有使用旧格式的现有插件将继续与Flutter应用程序配合使用。
## 在Visual Studio Code 中预览嵌入式 Dart DevTools
此版本中最大的工具更新是 Visual Studio Code 扩展,它提供了一项新功能的预览,使得开发者能够将 Dart DevTools 屏幕直接带入编码工作区。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image12)
使用新的 `dart.previewEmbeddedDevTools` 设置启用此功能,上面的屏幕截图显示了直接嵌入到 Visual Studio Code 中的 Flutter Widget Inspector ,启用了此新设置,你可以使用状态栏上 的Dart DevTools 菜单选择嵌入的收藏页面。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image13)
此菜单允许您选择要显示的页面。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image14)
该功能仍处于预览状态因此如果您有任何问题请告诉我们。https://github.com/Dart-Code/Dart-Code/issues
## 网络跟踪更新
Dart DevTools 的最新版本随附“网络”页面的更新版本,可启用 Web 套接字分析。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image15)
现在“Network” 页面会将计时信息以及你的状态和内容类型等其他信息添加到应用中的 network calls 中。对详细信息UI进行了其他改进以提供 websocket 或 http 请求中数据的概述。我们还为该页面提供了更多计划,包括 HTTP请求/响应主体和监视 gRPC 流量。
## Updating import statements on file rename
Visual Studio Code 的另一个新功能是在重命名时更新导入,当文件被移动或重命名时,它会自动更新导入语句。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image16)
该功能目前仅适用于单个文件,不适用于多个文件或文件夹,但即将推出该功能。
## Tooling metadata for every tool builder
还要提到的另一项更新是针对构建 Flutter 工具的人员,我们在 GitHub 上创建了一个新项目,以捕获和发布有关 Flutter 框架本身的元数据,它提供以下内容的机器可读数据文件:
- 当前所有Flutter小部件的[目录](https://github.com/flutter/tools_metadata/blob/master/resources/catalog/widgets.json)395个小部件;
- Material 和 Cupertino 颜色集的 Flutter 框架[颜色名称到颜色值的映射];(https://github.com/flutter/tools_metadata/tree/master/resources/colors)
- Material和Cupertino图标的[图标元数据](https://github.com/flutter/tools_metadata/tree/master/resources/icons),包括图标名称和预览图标;
这与我们自己用于 Android Studio / IntelliJ 和 VS Code 扩展的元数据相同;我们认为这在构建自己的工具时可能会觉得有用。实际上,此元数据使 IntelliJ IDE 系列的功能可以显示Flutter代码中使用的颜色
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image17)
与此相关的是IntelliJ和Android Studio中的一项新功能该功能显示 `Color.fromARGB`和`Color.fromRGBO`的色块:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image18)
特别感谢 GitHub 上的 dratushnyy 为 IntelliJ 中的颜色预览做出了贡献!
## Typesafe platform channels for platform interop
为了响应用户调查中插件作者的普遍需求,最近我们一直在尝试如何使 Flutter 与主机平台之间的通信对于插件和 Add-to-App 更安全更轻松。为了满足这一需求,我们创建了 `Pigeon` 这个命令行工具,该工具使用 Dart 语法在平台通道顶部生成类型安全的消息传递代码,而无需添加其他运行时依赖项。
使用Pigeon你可以在直接调用 Dart 方法的情况下调用 Java / Objective-C / Kotlin / Swift 类方法并传递非基本数据对象,而无需在平台通道上手动匹配方法字符串和序列化参数。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-120/image19)
虽然仍然处于预发行阶段,但是 Pigeon 已经变得足够成熟,因此我们可以在 video_player 插件中使用它。如果您想对 Pigeon 进行测试以供自己使用,请参阅更新的[平台渠道文档](https://flutter.dev/docs/development/platform-integration/platform-channels#pigeon)以及[该示例项目](https://github.com/flutter/samples/tree/master/add_to_app/flutter_module_books)。
## 无法列出太多工具更新
Flutter 1.20 时间表中的工具发生了太多重大变化,因此我们无法在此处列出所有内容。但是,您可能希望自己查看更新公告:
- [VS Code扩展v3.13](https://groups.google.com/g/flutter-announce/c/TlN12RemsYw)
- [VS Code扩展v3.12](https://groups.google.com/g/flutter-announce/c/8tSufvaRJUg)
- [VS Code扩展v3.11](https://groups.google.com/g/flutter-announce/c/gM0bqO7NFA0)
- [Flutter IntelliJ插件M46发布](https://groups.google.com/g/flutter-announce/c/8C2v2ueXjts)
- [Flutter IntelliJ插件M47发布](https://groups.google.com/g/flutter-announce/c/6SF3PG_XB8g/m/6mAY7eC_AAAJ)
- [Flutter IntelliJ插件M48发布](https://groups.google.com/g/flutter-announce/c/i9NTk5o9rZQ)
- [Flutter内置的面向Flutter开发人员的新工具](https://medium.com/flutter/new-tools-for-flutter-developers-built-in-flutter-a122cb4eec86)
## 重大变化
与以往一样我们试图将重大更改的数量保持在较低水平。以下是Flutter 1.20版本中的列表。
- [#55336](https://github.com/flutter/flutter/pull/55336) Adding `tabSemanticsLabel` to `CupertinoLocalizations` - [迁移指南PR](https://github.com/flutter/website/pull/3996)
- [#55977](https://flutter.dev/go/clip-behavior) Add `clipBehavior` to widgets with `clipRect`
- [#55998](https://groups.google.com/forum/#!searchin/flutter-announce/55998%7Csort:date/flutter-announce/yoq2VGi94q8/8pTsRL28AQAJ) Fixes the navigator pages update crashes when there is still route.
- [#56582](https://flutter.dev/docs/release/breaking-changes/cupertino-tab-bar-localizations#migration-guide) Update Tab semantics in Cupertino to be the same as Material
- [#57065](https://github.com/flutter/flutter/pull/57065) Remove deprecated child parameter for NestedScrollViews overlap managing slivers
- [#58392](https://github.com/flutter/flutter/pull/58392) iOS mid-drag activity indicator
## Summary
希望你和我们一样对这个版本感到兴奋,从许多角度来看,这是 Flutter 迄今为止最大的发行版。随着性能的提高,新的和更新的小部件以及工具的改进,我们只能做到更突出。我们要感谢社区贡献者的数量不断增长,而且不断壮大,使每个 Flutter 版本都可以比以前的版本更大,更快,更强大。还有更多的功能,包括对空安全性的支持,新版本的 `Ads``Maps` 和 `WebView` 插件,以及正在进行的更多工具支持。

344
Flutter-200.md Normal file
View File

@ -0,0 +1,344 @@
今天很高兴地宣布 Flutter 2 的发布距离Flutter 1.0 的发布已经两年多了,但是在很短的时间内, Flutter 已经关闭了 24,541 issues并合并了 765 个贡献者的 17,039个PR。
自去年9月 Flutter 1.22 发布以来Flutter 已经关闭了 5807 issues 并合并了 298位贡献者的 4091 个PR。
### Web
截止到今天Flutter 的 Web 支持已经从 Beta 过渡到稳定 Channel 。在此初始稳定版本中Flutter 在 Web 平台下将代码的可重用性提高到另一个层次因此现在当开发者创建Flutter 应用程序时Web 只是该应用程序的另一个可支持的目标设备。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image1)
通过利用 Web 平台的众多优势Flutter 为构建丰富的交互式Web应用程序奠定了基础Flutter 主要专注于性能和渲染保真度的改进,除了 HTML renderer 之外,我们还添加了一个新的基于 CanvasKit 的渲染器,另外我们还添加了特定于 Web 的功能,例如 [Link Widget](https://pub.dev/documentation/url_launcher/latest/link/Link-class.html) 以确保在浏览器中运行的应用感觉像Web应用。
> 你可以在Flutter的 Web 支持博客文章中找到有关此稳定版本的更多详细信息: https://medium.com/flutter/web-post-d6b84e83b425
### Sound Null Safety
空安全声明是 Dart 语言的重要补充,它通过区分可空类型和非可空类型进一步增强了类型系统,这使开发人员能够防止 null 错误崩溃。
通过将空检查合并到类型系统中,开发者可以在开发过程中捕获这些错误,从而防止生产崩溃。从 Flutter 2 开始,包含 Dart 2.12 的稳定版完全支持空安全声明。
> 有关更多详细信息,请参见 Dart 2.12博客文章https://medium.com/dartlang/announcing-dart-2-12-499a6e689c87
pub.dev 包存储库已经发布了 1,000 多个空安全软件包,其中包括 DartFlutterFirebase 和 Material 团队的数百个软件包。
> 如果你是软件包作者,请查看迁移指南并考虑立即进行迁移: https://dart.dev/null-safety/migration-guide
### Desktop
在此版本中Flutter的桌面支持已经发布在稳定 Channel这意味着 Flutter 已经准备好让你尝试一下使用它开发桌面应用当然你可以将其视为“beta snapshot”以预览将于今年晚些时候发布的最终稳定版本。
> PS :所以这是为了赶 KPI 才发布的么?
为了使 Flutter 桌面达到发布的质量Flutter 从大小上进行了改进,从确保文本编辑像在每个受支持的平台上的原生体验一样开始,包括诸如:[text selection pivot points](https://github.com/flutter/flutter/pull/71756)以及 [a keyboard event once its been handled](https://github.com/flutter/flutter/issues/33521)的能力。
在处理完键盘事件后,在鼠标输入端现在可以立即开始使用高精度定点设备进行拖动,而不必等待处理触摸输入时所需的延迟。
此外内置的上下文菜单已添加到 Materia l和 Cupertino 设计语言的 `TextField``TextFormField` 控件中。
最后,[grab handles have been added](https://github.com/flutter/flutter/pull/74299) 已经被添加到 `ReorderableListView` 控件中。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image2)
`ReorderableListView` 现在具有可拖住的功能,可通过鼠标轻松拖放,
在移动项目中 `ReorderableListView` 要求用户长按才能启动拖动,这哥场景在移动设备上适用,但是很少有台式机用户会想到用鼠标长按某个项目来移动它,因此此版本还包括适用于鼠标或触摸输入的移动方式。另外常用功能的另一项改进是更新的滚动条,该滚动条可以正确显示桌面形状因素。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image3)
此版本还包括一个更新的 `Scrollbar` 控件,该控件在桌面环境中非常使用,包括拖动预览、单击轨道以上下滚动页面以及在鼠标悬停在鼠标的任何部分上时显示轨道的功能。
此外由于 `Scrollbar` 是使用新 `ScrollbarTheme` 主题,因此开发者可以设置其样式以使其与应用程序的外观和风格相匹配。
对于其他特定于桌面的功能,此版本还启用了 Flutter 应用程序的命令行参数处理功能,以便可以使用诸如 Windows File Explorer 中的文件双击之类的简单操作来打开应用程序中的文件。
另外 Flutter 在致力于在应用在 Windows 和 macOS 的上调整大小变得更加流畅并为国际用户启用IME输入法编辑器
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image4)
> 此外我们还提供了更新的文档介绍了开始准备将桌面应用程序部署到特定操作系统商店时需要执行的操作。https://flutter.dev/desktop#distribution
在尝试使用 Flutter 桌面 Beta 时,开发者可以通过按预期方式切换到 Beta 通道并根据flutter.dev 上的指导为目标平台设置配置标志来访问它。此外,我们还制作了稳定通道上可用的 beta 快照。
如果开发者使用 `flutter config` 启用某个桌面配置设置(例如 `enable-macos-desktop`),则可以尝试桌面支持的 beta 功能,而不必经历漫长的过程如删除 Flutter SDK 后才能转移到 beta 频道等,这非常适合尝试一下或将桌面支持用作简单的 “Flutter Emulator.”。
但是,如果您选择停留在 Stable Channel 上以访问桌面 Beta则不会像切换到Beta或dev频道那样快地获得新功能或错误修复,因此如果你正在积极地针对 WindowsmacOS 或 Linux我们建议您切换到可更快提供更新的渠道。
> 当 Flutter 桌面的第一个完整的生产版本快完全发布时,我们知道还有更多工作要做,包括对与本机顶级菜单集成的支持,更接近各个平台的文本编辑体验以及可访问性支持,以及常规的
### New iOS features
此版本带来了与 iOS 相关的178个PR合并包括 [#23495](https://github.com/flutter/engine/pull/23495)将状态恢复带到iOS[#67781](https://github.com/flutter/flutter/pull/67781)它满足了长期存在的直接从命令行构建IPA而无需打开Xcode的要求以及 [#69809](https://github.com/flutter/flutter/pull/69809)更新了CocoaPods版本以匹配最新工具。
此外Cupertino 设计语言实现中还添加了一些 iOS 控件,如新的`CupertinoSearchTextField` 提供了 iOS 搜索栏 UI。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image5)
`CupertinoFormSection``CupertinoFormRow` 和 `CupertinoTextFormFieldRow` 控件更容易满足 iOS 的设计风格。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image6)
除了适用于iOS的功能外在着色器和动画方面我们还将继续 iOS 和 Flutter 的性能改进iOS仍然是 Flutter 的主要平台,我们将继续努力带来重要的新功能和性能改进。
### New widgets: Autocomplete and ScaffoldMessenger
此版本的 Flutter 附带了两个新控件: `AutocompleteCore``ScaffoldMessenger`
`AutocompleteCore` 表示将自动完成功能纳入 Flutter 应用程序所需的基本
功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image7)
> 自动完成是 Flutter 经常需要的功能,如果对完整功能的设计感到好奇,请查看自动完成设计文档。 https://docs.google.com/document/d/1fV4FDNdcza1ITU7hlgweCDUZdWyCqd-rjz_J7K2KkfY/
`ScaffoldMessenger` 用来处理许多与 `SnackBar` 相关的问题,包括能够轻松创建`SnackBar` 以响应 `AppBar` 动作;创建 `SnackBars` 以在 `Scaffold` 过渡之间持久存在的能力;能够在 `SnackBars` 完成时显示 `SnackBars`的能力,即使用户已导航到具有其他 `Scaffold` 的页面,也将执行异步操作。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image8)
所有这些优点可以从现在开始使用几行代码来显示 SnackBars
```
final messenger = ScaffoldMessenger.of(context);
messenger.showSnackBar(SnackBar(content: Text(I can fly.)));
```
### Multiple Flutter instances with Add-to-App
从与许多 Flutter 开发人员的交谈中我们了解到,许多人没有使用 Flutter 开发全新应用程序的想法,但他们可以通过将 Flutter 添加到现有的 iOS 和 Android 应用程序中来利用 Flutter。
此功能称为 [Add-to-App](https://flutter.dev/docs/development/add-to-app),是在两个移动平台上重用 Flutter 代码同时仍保留现有本机代码库的绝佳方法。但是在此之前我们有时会听到,不清楚如何将第一个页面集成到 Flutter 中。
将 Flutter 和本机交织在一起会使得导航状态难以维护,并且在视图级别集成多个 Flutter 会占用大量内存。
过去其他 Flutter 实例的存储成本与第一个实例相同在Flutter 2 中我们将创建额外的Flutter 引擎的静态内存成本降低了约 99每个实例约为 180kB。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image9)
支持此功能的新 API 可以在 beta 通道上预览,并在 flutter.dev 上记录了一系列演示此新模式的示例项目通过此更改我们不再犹豫建议在本机应用程序中创建Flutter引擎的多个实例。
### Flutter Fix
每当任何框架成熟并使用越来越多的代码库聚集用户时随着时间的推移趋势就是避免对框架API进行任何更改以避免破坏越来越多的代码行。
Flutter 2 拥有超过 500,000 个Flutter开发人员涉及的平台数量越来越多因此它很快就面临了这样的问题。但是为了使我们能够随着时间的推移不断改进 Flutter我们希望能够对 API 进行重大更改。问题是如何在不中断开发人员的情况下继续改进Flutter API
我们的答案是 Flutter Fixhttp://flutter.dev/docs/development/tools/flutter-fix
Flutter Fix 是事物的组合。首先,`dartCLI ` 工具有一个新的命令行选项,名为 dart fix ,它知道在哪里可以查找已弃用的 API 列表以及如何使用这些 API 更新代码。其次它是可用修补程序本身的列表,最后它是针对 VS CodeIntelliJ 和 Android Studio IDE 的更新的 Flutter 扩展集,它们知道哪些改变是属于公开相同的内容,展示可用的修复程序列表,如带小划线的快速修复程序,可帮助您单击鼠标来更改代码。
举例来说,假设您的应用中包含以下代码行:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image10)
由于不推荐使用此构造函数的参数,因此应将其替换为以下内容:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image11)
即使你熟悉的 Flutter 中所有被弃用的内容,但在代码中必须进行的更改数量也就越大,应用所有修补程序的难度就越大,并且更容易出错。
人类在这类重复性任务上并不擅长。但是计算机很擅长;通过执行以下命令,就可以看到我们如何在整个项目中进行的所有修复:
```
$ dart fix --dry-run
```
如果您想批量应用它们,可以轻松地这样做:
```
dart fix --apply
```
或者如果您想在自己喜欢的IDE中以交互方式应用这些修补程序也可以这样做
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image12)
多年来我们一直在将旧的API标记为已弃用但是现在有了关于何时删除实际已弃用的API的政策Flutter 2 是我们第一次这样做。
即使我们尚未捕获所有已弃用的API作为数据来提供 Flutter Fix但我们仍将继续从先前已弃用的 API 中添加更多信息,并将在未来的重大更改中继续这样做。
我们的目标是尽最大努力使 Flutter 的 API 达到最佳状态,同时还要使您的代码保持最新。
### Flutter DevTools
为了清楚说明 DevTools 是用于调试Flutter应用程序的工具我们在调试 Flutter 应用程序时将其重命名为 Flutter DevTools 。此外我们还做了很多工作,以使其达到 Flutter 2的生产质量。
在您启动 DevTools 之前也可以帮助开发者解决问题的新功能是Android StudioIntelliJ 或 Visual Studio Code 能够在出现常见异常时发出通知并提供将其引入DevTools 中以帮助您调试的功能它。
例如,以下内容显示您的应用程序中已引发溢出异常,该异常会在 Visual Studio Code 中弹出一个选项用于调试DevTools中的问题。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image13)
按下该按钮可打开出现问题控件上的 DevTools 中的 Flutter Inspector因此可以对其进行修复。
今天我们仅针对布局溢出异常执行此操作但我们的计划是针对所有常见异常提供这种处理DevTools可以解决这些异常。
一旦运行了 DevTools选项卡上的新错误标记将帮助开发者跟踪应用程序中的特定问题。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image14)
DevTools 的另一个新功能是能够轻松查看分辨率比显示的图像高的图像,这有助于跟踪过多的应用程序大小和内存使用情况。要启用此功能,请在 Flutter Inspector 中启用“反转超大图像”。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image15)
现在,当开发者显示分辨率明显大于其显示尺寸的图像时,该图像将上下颠倒显示,以便在开发者的应用中轻松查找。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image16)
此外,根据大众的需求,除了在 Flutter Inspector 的“布局资源管理器”中显示有关灵活布局的详细信息外,我们还添加了显示固定布局的功能,使开发者能够调试各种布局。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image17)
这还不是全部这只是Flutter DevTools 2中更多新功能的摘要
- 在 Flutter 框架图中添加了平均 FPS 信息并提高了可用性;
- 用红色错误标签在网络事件探查器中调出失败的网络请求。
- 更快的新内存视图图表,更小且更易于使用,其中包括用于描述特定时间活动的新悬浮卡。
- 将搜索和过滤添加到“日志记录”选项卡。
- 在启动DevTools之前跟踪日志因此启动时可以查看完整的日志历史记录。
- 将“性能”视图重命名为“ CPU Profiler”以使其更清楚地提供什么功能。
- 向 CPU Profiler 火焰图添加了时序网格。
- 将“时间轴”视图重命名为“性能”,以便更清楚地了解其提供的功能。
### Android Studio / IntelliJ扩展
用于 IntelliJ 系列 IDE 的 Flutter 插件也为 Flutter 2 提供了许多新功能,首先有一个新的项目向导,它与 IntelliJ 中的新向导样式匹配。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image18)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image19)
另外如果正在 Linux 上使用 IntelliJ 或 Android Studio 对从 Snap Store 安装的Flutter SDK 进行编程,则 Flutter 快照路径已添加到已知 SDK 路径列表中这使Flutter 快照的用户可以更轻松地在“设置”中配置 Flutter SDK。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image20)
### Visual Studio代码扩展
Visual Studio Code 的 Flutter 扩展也对 Flutter 2 进行了改进,从许多测试增强功能开始,包括重新运行仅失败的测试的功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image21)
经过两年的开发,对 Dart 的LSP语言服务器协议支持现已作为默认方式提供给 Dart 分析器,以将其集成到 Flutter 扩展的 Visual Studio Code 中。
LSP 支持对 Flutter 开发进行了许多改进包括能够在当前Dart文件中应用某种类型的所有修复程序并使代码完成生成完整的函数调用包括括号和必需的参数的功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image22)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image23)
LSP 的支持不仅限于Dart它还支持 pubspec.yaml 和 analysis_options.yaml 文件中的代码完成。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image24)
### DartPad updated to support Flutter 2
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image25)
现在,开发者可以尝试使用 Flutter 的新的空安全版本,而无需离开自己喜欢的浏览器。
### Ecosystem updates
Flutter 的开发经验不仅包含框架和工具,还包括其他内容,它还包括适用于 Flutter 应用程序的各种软件包和插件。
自上一次 Flutter 稳定版本发布以来,该领域也发生了很多事情。例如,在 `camera` 和`video_player` 插件之间已合并了将近30个PR以大大提高两者的质量。
另外,如果你是一个 `Firebase` 的用户,我们很高兴地宣布最流行的插件质量已经得到了新的提升,包括空安全的支持,以及全套的支持 AndroidiOSWeb和 MacOS这些插件包括
- Core
- Authentication
- Cloud Firestore
- Cloud Functions
- Cloud Messaging
- Cloud Storage
- Crashlytics
另外,如果您正在寻找应用程序的崩溃报告,则可能需要考虑 Sentry该公司已经发布了适用于Flutter应用程序的新SDKhttps://blog.sentry.io/2021/03/03/with-flutter-and-sentry-you-can-put-all-your-eggs-in-one-repo/ 。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image26)
借助Sentry的Flutter SDK可以实时收到在 AndroidiOS或本机平台上发生的错误的通知。
此外,如果还没有看到 Flutter Community 的 “plus” 插件,则需要将其签出。
他们分叉了 Flutter 团队最初开发的许多受欢迎的插件,并添加了 null 安全支持,对其他平台的支持和一整套全新的文档,以及开始修复 flutter/plugins 存储库中的适当问题,该插件包括以下内容:
- Android Alarm+
- Android Intent+
- Battery+
- Connectivity+
- Device Info+
- Network Info+
- Package Info+
- Sensors+
- Share+
> http://plus.fluttercommunity.dev/
此时与 Flutter 兼容的软件包和插件集的数量超过 15,000这会使得很开发者难找到优质的的软件包和插件。
因此,我们会发布发布点数(静态分析得分),受欢迎程度,喜欢度,并且,对于特别高的质量,会发布那些特别标记为 Flutter Favorite 的包装,为了及时应对 Flutter 2我们在收藏夹列表中添加了几个新软件包
- animated_text_kit
- bottom_navy_bar
- chopper
- font_awesome_flutter
- flutter_local_notifications
- just_audio
最后但并非最不重要的一点是,对于对软件包的是否适用于 Flutter 的最新版本感兴趣的软件包作者或软件包用户,您将需要访问 Codemagic 的新 pub.green 网站。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-200/image27)
Codemagic 新的 pub.green 网站显示了最新 Flutter 版本与顶级软件包的兼容性,
pub.green 网站测试了 pub.dev 上可用的 Flutter 和 Dart 软件包与不同Flutter版本的兼容性。
> 详细可见https://blog.codemagic.io/pub-green/
### Breaking Changes
我们对 Flutter 2 进行了以下重大更改,其中许多可以使用 dart fix 命令或所选 IDE 中的快速修复程序自动缓解:
- [#61366](https://github.com/flutter/flutter/pull/61366) Continue the clipBehavior breaking change。
- [#66700](https://github.com/flutter/flutter/pull/66700) 默认 `FittedBox``clipBehavior` 为无。
- [#68905](https://github.com/flutter/flutter/pull/68905) 从 `Cupertino` 颜色分辨率 API 删除 nullOk 参数
- [#69808](https://github.com/flutter/flutter/pull/69808) 从 `Scaffold.of``ScaffoldMessenger.of` 删除 nullOk 参数
- [#68910](https://github.com/flutter/flutter/pull/68910) 从 `Router.of ` 中删除 nullOk 参数,并使其返回不可为空的值
- [#68911](https://github.com/flutter/flutter/pull/68911) 添加 `maybeLocaleOf` 到本地化
- [#68736](https://github.com/flutter/flutter/pull/68736) 在 `Media.queryOf` 删除 nullOK
- [#68917](https://github.com/flutter/flutter/pull/68917) 从 `Focus.of``FocusTraversalOrder.of``FocusTraversalGroup.of` 中删除 nullOk 参数
- [#68921](https://github.com/flutter/flutter/pull/68921) 从 `Shortcuts.of` `Actions.find` 和 `Actions.handler` 中删除 nullOk 参数
- [#68925](https://github.com/flutter/flutter/pull/68925) 从`AnimatedList.of` 和 `SliverAnimatedList.of` 中删除nullOk参数
- [#69620](https://github.com/flutter/flutter/pull/69620) 从 `BuildContex` 中删不推荐使用的方法
- [#70726](https://github.com/flutter/flutter/pull/70726) 从 `Navigator.of` 中删除 nullOk 参数,并添加 `Navigator.maybeOft`
- [#72017](https://github.com/flutter/flutter/pull/72017) 删除不推荐使用的`CupertinoTextThemeData.brightness`
- [#72395](https://github.com/flutter/flutter/pull/72395) 从 `HoverEvent` 中删除不建议使用的 `PointerEnterEvent``PointerExitEvent` 。
- [#72532](https://github.com/flutter/flutter/pull/72532) 删除不建议使用的`showDialog.child`
- [#72890](https://github.com/flutter/flutter/pull/72890) 删除不推荐使用的`Scaffold.resizeToAvoidBottomPadding`
- [#72893](https://github.com/flutter/flutter/pull/) 删除不推荐使用的`WidgetsBinding`.[`deferFirstFrameReport``allowFirstFrameReport`]
- [#72901](https://github.com/flutter/flutter/pull/#72901) 删除不推荐使用的 `StatefulElement.inheritFromElement`
- [#72903](https://github.com/flutter/flutter/pull/#72903) 删除不推荐使用的 `Element` 方法
- [#73604](https://github.com/flutter/flutter/pull/73604) 删除不建议使用的 `CupertinoDialog`
- [#73745](https://github.com/flutter/flutter/pull/73745) 从 [CupertinoSliver] `NavigationBar` 删除不推荐使用的 `actionForegroundColor`
- [73746](https://github.com/flutter/flutter/pull/#73746) 删除不赞成使用的 `ButtonTheme.bar`
- [#73747](https://github.com/flutter/flutter/pull/73747) 删除 span deprecations
- [#73748](https://github.com/flutter/flutter/pull/73748) 删除弃用的 `RenderView.scheduleInitialFrame`
- [#73749](https://github.com/flutter/flutter/pull/73749) 删除不赞成使用的 `Layer.findAll`
- [#75657](https://github.com/flutter/flutter/pull/75657) 从 `Localizations.localeOf` 删除残留的 nullOk 参数
- [#74680](https://github.com/flutter/flutter/pull/74680) 从`Actions.invoke` 删除 nullOk ,添加 `Actions.maybeInvoke` .

590
Flutter-220.md Normal file
View File

@ -0,0 +1,590 @@
> 原文链接https://medium.com/flutter/whats-new-in-flutter-2-2-fd00c65e2039
**本次 Flutter 2.2 正式版主要着重于优化:包括 iOS 性能改进Android 延迟加载组件,针对 Flutter Web 的更新等等**
每个 Flutter 新稳定版本的发布都会带来一些更新,无论是性能增强、新功能还是错误修复,尽管 Flutter 2 才发行了两个月,但 2.2 依旧在 Flutter 2 的基础上做了很多改进,**该版本合并了 2456 个 PR涉及 Framework、 engine 和 plugins 的 issue 关闭了 3105 个 **
## Flutter 2.2 更新稳定
此版本在 Flutter 2 之上进行了大量的改进,包括 AndroidiOS 和 Web 上的更新,如新的`Material` 图标,文本处理,滚动条行为的更新以及对 `TextSpan` 控件的鼠标光标支持。
### Dart 2.13
Flutter 2.2 包含了 Dart 2.13 版本,此 Dart 更新主要包含一个**新的类型别名功能**,使开发者能够为类型和函数创建别名:
```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 内容 https://medium.com/dartlang/announcing-dart-2-13-c6d547b57067
### Flutter Web 更新
Flutter Web 作为 Flutter 最新的稳定平台Web 在此版本中做了很多的改进。
首先,**使用新的 service 加载机制优化了缓存行为**,并修复了的重复下载 `main.dart.js` 的问题。
在 Flutter Web 的早期版本中,后台在更新下载到应用程序后,用户不刷新浏览器是不会看到这些更改,而从 Flutter 2.2 开始,当检测到更改时用户可以直接看到更新,而无需再次手动刷新页面。
> 启用此更改要求重新生成 Flutter 应用的 `index.html`,所以你可以先保存 `index.html` 里的修改,然后删除 `index.html` 文件,再通过 `flutter create .` 在项目目录中运行从而重新创建它。
**Flutter 2.2 还对两个 Web 渲染器进行了改进:**
- **对于 HTML 添加了对字体功能的支持**,启用设置 `FontFeature` 以及使用画布 API 渲染文本,以便在悬停时将其显示在正确的位置。
- **对于 HTML 和 CanvasKit都添加了 `computeLineMetrics` 和对着色器蒙板的支持**,以解决 Flutter Web 和移动应用程序之间的差距,例如:开发人员现在可以使用不透明蒙板,使用着色器蒙板执行淡出过渡,并使用 `computeLineMetrics` 像在移动应用程序中一样使用。
对于 Flutter Web 而言,`Semantics` 是的首要任务之一, Flutter 通过构建`SemanticsNode` 树来实现可访问性。Flutter Web 用户启用 `Semantics` 后,框架将生成与 `DOM` 树平行的 `RenderObjectDOM`树,并将语义属性转换为 `Aira`
在此版本中改进了语义节点的位置,以缩小使用转换时移动和桌面 Web 应用程序之间的距离,这意味着在使用转换为 `Widget` 设置样式时,焦点框应正确显示在元素上。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image1)
我们还在配置文件和发布模式下使用命令行标志公开了语义节点调试树,以帮助开发人员通过可视化为其 Web 应用程序创建的语义节点来调试可访问性。
要在 Flutter Web 应用启用此功能,请运行以下命令:
```
$ flutter run -d chrome --profile \
--dart-define = FLUTTER_WEB_DEBUG_SHOW_SEMANTICS = true
```
激活该标志后将能够在 `Widget` 顶部看到语义节点,就可以调试并查看语义元素是否放置在不应放置的位置。
虽然在支持一系列核心辅助功能方面取得了比较大的进步,但我们将继续改善辅助功能的支持。在 2.2 稳定版之后的 `master``dev` 通道上可用的内部版本中,我们还添加了一个 API使得开发人员能够以编程方式自动启用其应用程序的可访问性并解决了将 Tab 与屏幕阅读器配合使用的问题。
**最后最新版本的 Flutter DevTools 现在支持 Flutter Web 应用**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image2)
### iOS页面过渡和增量安装
**在此版本中对于 iOS 我们通过将渲染动画帧所需的时间减少了 75** ,使在 `Cupertino` 中的页面过渡更加平滑么。
在此版本中还实现了在开发过程中增量的iOS安装**基准测试中我们发现安装更新版本的 iOS 应用程序的时间减少了40**。
### 使用 Flutter 构建自适应平台应用
随着 Flutter 稳定版的支持平台越来越多,不仅需要考虑支持不同形式的设备(例如移动设备,平板电脑和台式机),还需要支持不同输入类型(触摸与鼠标+键盘)以及具有不同平台的应用,所以我们将:**可以根据不同目标平台的详细信息,进行自我调整的应用称为“平台自适应”应用**。
> 更多可见https://flutter.dev/docs/development/ui/layout/building-adaptive-apps
对于根据这些原则为多个平台编写的 Demo 的应用程序,我们推荐参考 `gSkinner` 的 [Flokk](https://flutter.gskinner.com/flokk) 和 [Flutter Folio](https://flutter.gskinner.com/folio) 应用程序。
Flutter 平台自适应应用指南的 UX 部分基于新的大屏幕 `Material` 指南,`Material` 团队的新指南包括对一些主要布局文章的处理,以及对多个组件的更新和更新的设计套件,所有这些都考虑到了大屏幕。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image3)
### 更多材料图标
在“ `Material` 指南”的主题上,在此发行版中我们分割出两个单独的 PR为 Flutter 添加了新的 `Material` 图标,包括 `Dash` 自己的图标。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image4)
这些更新使开发者的应用程序的 `Material` 图标总数达到了 7,000 多个现在可以在fonts.google.com/icons 上按类别和名称进行搜索。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image5)
> 找到合适的图标后,新的 Flutter 标签会显示如何使用它,或者可以选择仅下载该图标以用作应用程序中。
### 改善文字处理
文本处理一直是 Flutter 里着重处理的领域,在此版本中已经开始重构处理文本输入的方式,以启用诸如在 **`Widget` 点击冒泡时取消 `keystroke` 之类的功能,并引入完全自定义与文本操作相关的 `keystrokes` 的功能**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image6)
能够取消 `keystrokes` 使 **Flutter 能够实现使用空格键和箭头键之类触发滚动的功能**,从而为最终用户提供更直观的体验。在 `keystrokes` 进入到应用程序中的父窗口 `Widget` 之前,开发者可以使用相同的功能来处理 `keystrokes`
另一个示例是可以在 `TextField` 和按钮之间使用 Tab 键切换:
```dart
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')),
],
),
);
}
```
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image7)
**自定义文本操作让开发者可以执行诸如 `TextField``Enter` 键的特殊处理之类的操作**,例如可以触发在聊天客户端中发送消息,同时允许通过 `Ctrl` + `Enter` 插入换行符。
> 这些文本操作使 Flutter 本身可以提供不同的 `keystrokes` ,以将文本编辑的行为与主机 OS 本身进行匹配,如 Windows 和 Linux上 的 `Ctrl + C` 和 macOS 上的 `Cmd + C`
下面的示例将覆盖默认的向左箭头操作,并为 `Backspace``Delete` 键提供新的操作:
```dart
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();
}
}
```
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image8)
### 自动滚动行为
实际显示滚动条时 Android 和 iOS 的逻辑是相同的,而对于桌面应用程序,当内容大于容器时通常会自动显示滚动条,这需要添加 `Scrollbar` 作为父 `Widget`**为了在手机或 PC 上都能正常,此版本`Scrollbar` 会在必要时会自动添加**。
例如下面所示的无滚动条的代码:
```dart
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'),
),
);
}
```
在桌面上运行它时,将显示一个滚动条:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image9)
如果你不喜欢滚动条的外观或始终显示滚动条的逻辑,**可以设置一个 `ScrollBarTheme`,则可以在整个应用范围内或在特定实例上,通过设置来更改它 `ScrollBehavior` 来完成修改**。
### 鼠标光标在文本范围内
在 Flutter 的早期版本中,开发者可以在任何窗口小部件上添加鼠标光标(如指示可点击内容的手),而实际上 Flutter 本身在大多数情况下会添加这些鼠标光标,例如:在所有按钮上添加一个手形鼠标光标。
但是如果要运行带有不同文本跨度,且具有各自样式并且可能足够长的自动换行的格式丰富的文本,那么`TextSpan` 就不会是一个 `Widget`,因此不能用作鼠标光标的可视范围...而从此版本开始,**当拥有 `TextSpan` 带有手势识别器的时将自动获得相应的鼠标光标**
```dart
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');
},
),
],
),
),
),
);
}
```
现在可以拥有所需的自动换行文字跨度,并且其中任何带有识别器的文字都将获得适当的鼠标光标。
![image.png](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image10)
在此版本中,`TextSpan` 还支持 `onEnter``onExit` ,并且对应的拥有 `mouseCursor`
## Flutter 2.2 更新预览
除了可用于生产的新功能外Flutter 2.2 还提供了许多预览功能,包括 **iOS 着色器编译器性能改进Android 延迟组件支持Flutter 桌面更新以及 Sony 的 ARM64 Linux 主机支持**
### 预览iOS着色器编译改进
用图形渲染术语来说,“着色器” 是要在最终用户设备上可用的 GPU 编译并运行的程序。自成立以来 Flutter 一直在底层 Skia 图形库中使用着色器,以其自身的高质量图形效果(包括颜色,阴影,动画等)提供本机性能。
由于 Flutter API 的灵活性,着色器可以实时生成和编译,并与需要它们的帧工作负载同步,所以当编译着色器的时间超出框架预算时,体验结果对于用户来说会很明显。
为了避免出现问题,**Flutter 提供了在运行期间训练缓存着色器的功能,然后将它们打包并捆绑到应用程序中,并在 Flutter Engine 启动时在第一帧之前进行编译**。这意味着预编译的着色器不必在帧工作负载期间进行编译,也不会造成垃圾回收,但是 Skia 最初仅为 `OpenGL` 实现了此功能。
> 因此当我们默认情况下在 iOS 上启用 `Metal` 以响应 Apple 弃用 `OpenGL` 时,根据我们的基准测试,渲染帧时间增加了,而用户报告的产生的垃圾也增加了。
我们的测量数据表明这些报告通常是由于着色器编译时间增加Skia 为 `Metal` 后端生成的着色器数量,增加以及已编译的着色器无法在各次运行之间缓存,而使得 jank 持续到第一次运行之外而导致的一个应用程序。
> 因此直到现在,在 iOS 上避免这种麻烦的唯一方法是简化场景和动画,但这并不理想。
但是,**现在在 dev 通道上是 Skia 中对 `Metal` 的着色器预热的新支持的预览**,通过 SkiaFlutter 现在可以在第一帧工作负载开始之前编译带捆绑的着色器。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image11)
但是,此解决方案有一些警告:
- Skia 仍然需要为 `Metal` 生成比 `OpenGL` 后端更多的着色器;
- 最终的着色器对机器代码的编译仍需要与框架工作负载同步发生,但这比在框架渲染时间中进行整个着色器生成和编译要快;
- 首次运行应用程序后,将缓存生成的机器代码,直到重新启动设备为止;
如果想在应用程序中利用此新支持,可以按照 flutter.dev 上的说明进行操作。
但是,我们还没有完成这项工作。在 Android 和 iOS 上此实现都有一些缺点:
- 部署的应用程序的大小较大,因为它包含捆绑的着色器;
- 应用程序启动等待时间更长,因为捆绑的着色器需要预先编译;
- 开发人员暗示了我们对这种实现所带来的体验不满意;
我们认为最后一个问题最重要,特别是查看了执行培训运行的过程,并推理了因应用程序大小和应用程序启动延迟而带来过于繁琐的折衷。
**因此我们将继续研究,消除不依赖此实现的着色器编译垃圾以及所有垃圾的方法**。特别是我们正在与 Skia 团队合作,以减少响应 Flutter 的要求而生成的着色器的数量,并研究使用 Flutter Engine 捆绑的一小套静态定义的着色器实现。
> 可以在Flutter 中关注该项目以了解我们的进度https://github.com/flutter/flutter/projects/188
### Android 延迟加载组件
对于 Android 版本,使用 Dart 的拆分 AOT 编译功能,[允许 Flutter 应用程序在运行时下载包含提前编译的代码和 assets 的模块](https://github.com/flutter/flutter/pull/76192)。
**将这些可安装拆分的模块称为延迟组件**,通过仅在需要时才推迟下载代码和 assets ,可以大大减小初始安装大小,**例如我们实施了 `Flutter Gallery` 版本初始安装尺寸减少了 46 **。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image12)
在启用延迟组件的情况下进行构建时,**Dart 会将仅使用 `deferred` 关键字导入的代码编译到单独的共享库中,这些共享库与 assets 一起打包到延迟组件中**。
目前延迟组件仅在 Android 上可用,并且此功能作为早期预览版提供,在 flutter.dev 上新的[`Deferred components`](https://flutter.dev/docs/perf/deferred-components) 页面中了解如何实现延迟的组件。
> https://flutter.dev/docs/perf/deferred-components
>
> http://github.com/flutter/flutter/issues
### Flutter Windows UWP Alpha
Flutter 的另一个更新是针对 PC 的对Windows UWP 的支持已在移至了 alpha。UWP 允许将Flutter 应用程序带到无法运行标准 Windows 应用程序的设备包括Xbox
要进行尝试首先需要设置 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 UWP 应用程序在 Windows 的沙箱环境中运行,所以在开发过程中需要在本地主机上的应用程序防火墙上打一个洞,以启用诸如热重载和调试器断点之类的功能。
可以按照 Flutter 桌面文档页面 `checknetisolation` 上的说明使用命令执行此操作,完成此操作后可以在 Windows 上看到 Flutter 应用程序作为 UWP 应用程序运行。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image13)
当然也可以运行更多有趣的UWP应用例如在 Xbox 上运行的 Flutter 应用。
> 请查看flutter.dev/desktop/#windows-uwp。
### 索尼对 ARM64 Linux 主机的支持
Flutter 社区的另一项杰出成就来自 Sony 的软件工程师 HidenoriMatsubayashi他为针对ARM64 Linux 的支持做出了贡献,通过此 PR 可以在 ARM64 Linux 上构建和运行 Flutter 应用程序。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image14)
> https://github.com/flutter/flutter/pull/61221
### Flutter 生态系统和工具更新
Flutter Engine 和 Framework 只是整个 Flutter 生态的一部分,软件包生态系统和工具的更新对 Flutter 开发人员来说同样重要。
在生态系统方面,本次将发布许多新的 Flutter Favorite 软件包,以及 FlutterFireFlutter对 Firebase 的支持)的一些更新,其中 FlutterFire 支持新的 Firebase App Check 预览,因此 Flutter 开发人员可以马上就用到它。
在工具方面,**Flutter DevTools 进行了新的更新以优化应用程序的内存占用**,并为提供程序包增加了一个新选项卡,另外 **VS Code 和 Android Studio / IntelliJ 的 IDE 插件都有显着更新**,并且如果是针对 Flutter 的内容作者,则可以采用全新的方式将 DartPad 集成到作品中。
最后有一个名为 `FlutterFlow` 的新的低代码应用程序设计和构建工具,该工具针对 Flutter 并在Web上运行因为它本身是由 Flutter 构建的。
### Flutter 最受欢迎的更新
作为该版本的一部分Flutter 生态系统委员会认证了 24 个新的 Flutter Favorite 软件包,这是我们迄今为止最大的扩展,新标记的 Flutter 收藏夹包括:
- FlutterFire `cloud_firestore``cloud_functions``firebase_auth``firebase_core``firebase_crashlytics``firebase_messaging` 和`firebase_storage`
> http://firebase.flutter.dev/
- 社区 plus 包:`android_alarm_manager_plus``android_intent_plus``battery_plus``connectivity_plus``device_info_plus``network_info_plus``package_info_plus``sensors_plus` 和 `share_plus`
> http://plus.fluttercommunity.dev/
- `googleapis`
- `win32`
- `intl``characters`
- Sentry packages `sentry`和 `sentry_flutter`
- `infinite_scroll_pagination``flutter_native_splash`
所有这些软件包都已迁移到空安全的状态,并视情况支持 AndroidiOS 和 Web 。
> 例如firebase_crashlytics 上没有底层 SDKandroid_alarm_manager_plus 是专门为Android 设计的。
社区 plus 提供从 Flutter 团队包的超集。例如自 Flutter 最初发行之前Flutter 团队就由Google 的电池组提供了 `bettery package`,并且已迁移至零安全状态,但仅在 Android 和 iOS 上受支持,而 **`battery_plus` 包另一方面它支持所有六个 Flutter 平台,包括 WebWindowsmacOS 和 Linux**。
> 九个 “plus” 软件包都获得了 Flutter 受欢迎的奖项,这代表了 Flutter 整个社区在成熟度上迈出的一大步。
`googleapis` 插件提供了约 185 个 Google API 的自动生成的 Dart 包装器,可在客户端或服务器端 Dart应 用程序包括Flutter应用程序中使用。
`win32` 程序包是工程学的奇迹,**它使用 Dart FFI 封装了大多数常用的 Win32 API 调用**,以使 Dart 代码可以直接访问它们,而无需使用 C 编译器或 Windows SDK 。
随着 Flutter 在 Windows 平台上的流行,该 win32 软件包已成为许多流行插件(包括`path_provider`)最流行的插件的关键依赖项。作为完整性的测试,作者 timsneath 使用原始 Dart 在原始 Win32 中做了一些有趣的事情,例如实现记事本,蛇和俄罗斯方块:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image15)
> 该 win32 软件包绝对值得一试,看看你是否能够在 Windows 上使用 Dart 或 Flutter 进行了任何操作。
### FlutterFire 更新和 Firebase 应用程序检查
`FlutterFire` 是 Flutter 对 Firebase 的支持,是 Flutter 上最受欢迎的插件集合之一。
`Invertase` 在 Flutter 2 版本上投入生产以来一直在进行改进方面做得非常出色。实际上自FlutterFire 首次发布以来,`Invertase` 处理了 79 %的未解决问题,并将未完成的 PR 数减少了88
此外他们不仅在生产质量插件方面做得很好,而且还将 Beta 质量插件迁移到了零安全性,并使其在同一内核上构建和运行,以便开发者可以混合和匹配。
此外,`Invertase` 继续为 `FlutterFire` 插件添加新功能,其中包括对该版本 Flutter 进行的 Flutter 与 `Cloud Firebase` 集成的许多更新:
- [`Typesafe`](https://firebase.flutter.dev/docs/firestore/usage/#typing-collectionreference-and-documentreference) 用于读取和写入数据的API
- 支持 Firebase 本地仿真器套件;
- 使用数据包优化数据查询
最后 `FlutterFire` 支持新 Firebase 产品的 Beta 版本:`Firebase App Check`。
`Firebase App Check` 可保护您的后端资源(如 Cloud Storage )免受计费欺诈或网络钓鱼之类的滥用,借助 App Check 运行 Flutter 应用程序的设备,会使用应用程序身份证明提供程序来证明它确实是您的真实应用程序,并且还可以检查它是否在未受干扰的真实设备上运行。
> https://firebase.flutter.dev/docs/app-check/overview
### Flutter DevTools 更新
Flutter DevTools 在此版本中进行了许多值得注意的更新,**包括两项内存跟踪改进以及一个仅用于 provider 插件的全新标签**。
此版本的 DevTools 中的第一个内存跟踪改进功能,**提供了跟踪对象分配位置的功能,让开发者在代码中查找内存泄漏的位置非常方便。**
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image16)
第二种是**将自定义消息注入到内存时间轴的功能,这样开发者就可以提供特定于应用程序的标记,例如在完成一些占用大量内存的工作之前和之后,以便可以检查自己是否清理正确**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image17)
> 随着 Flutter 应用的规模越来越大,我们将继续确保 Flutter 开发人员拥有跟踪和修复各种内存泄漏和运行时问题所需的工具。
在使用要跟踪的 Flutter 框架时,不仅是运行时问题,而且还存在一些其他问题:**有时开发者也想跟踪与软件包有关的问题**。
pub.dev 上有超过 15,000 个与 Flutter 兼容的软件包和插件,应用随着时间的推移使用更多软件包的可能性越来越大。考虑到这一点,我们一直在尝试向 Flutter DevTools 添加新的 “Provider”选项卡。
事实上,这个标签是由 Remi Roussel 创建provider 包维护人员。如果你正在运行最新版本的Flutter DevTools并且正在调试使用 provider 插件的 Flutter 应用程序则将自动获得新的“Provider” 选项卡。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image18)
“Provider”选项卡向开发者显示与每个提供程序相关的数据包括**在运行应用程序时的实时更改,它可以让您直接更改数据,以测试应用程序的主要情况!**
这只是此发行版中Flutter DevTools中一些很酷的新功能有关完整列表请在此处查看各个公告
- Flutter DevTools 2.1 https://groups.google.com/g/flutter-announce/c/tCreMfJaJFU/m/38p1BBeiCAAJ
- Flutter DevTools 2.2.1 https://groups.google.com/g/flutter-announce/c/t8opLnUyiFQ/m/dJth-jKxAAAJ
- Flutter DevTools 2.2.3 https://groups.google.com/g/flutter-announce/c/t8opLnUyiFQ/m/YX5Ds_q0AgAJ
### IDE插件更新
Flutter 的 Visual Studio Code 和 IntelliJ / Android Studio IDE 扩展也已在此版本中更新,例如 Visual Studio Code 扩展现在支持两个附加的 Dart 代码重构:**内联方法和内联局部变量**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image19)
在 Android Studio / IntelliJ 扩展中,我们添加了**使用选项将所有堆栈跟踪打印到控制台的功能**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image20)
### DartPad workshops
为了确保我们能够在迅速发展的 Flutter 开发人员社区中准备好文档Dart 和 Flutter 团队一直在寻找改进和扩展创建教育内容的方法。
在此版本中,我们为 DartPad 添加了一个新的分步 UI开发人员可以使用该 UI 跟随讲师指导的讲习班。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-220/image21)
通过直接向 DartPad 添加说明,我们可以为 I/O 提供指导性的工作室体验,但是我们不只是为自己的工作室构建它;如果你想在 Dart 或 Flutter Workshop 中使用它,可以按照 DartPad Workshop 创作指南进行操作。
> https://github.com/dart-lang/dart-pad/wiki/Workshop-Authoring-Guide
这样的主旨在于利用 DartPad 共享代码,并在自己的网站中嵌入 DartPad 。
### 社区聚焦FlutterFlow
**FlutterFlow 是一款“低代码”应用程序设计和开发工具,可以通过浏览器中构建所有应用程序,它提供了一种所见即所得的环境**,可以使用 Firebase 的真实数据跨多个页面布置你的应用程序。
低代码工具的目标是轻松完成大多数常见的事情从而开发者可以编写尽可能少的自定义代码行。实际上作为演示他们构建了一个完整的多页移动应用程序用于在不到一个小时的时间内你可以在YouTube 上看到整个过程。
> https://youtu.be/TXsjnd_4SBo
FlutterFlow 输出 Flutter 代码因此如果需要添加代码以进一步自定义应用程序你可以在flutterflow.io 上了解有关 FlutterFlow 产品发布的信息。
> https://flutterflow.io/blog/launch
## 重大变化
与往常一样,我们一直努力减少重大更改的数量,在此版本中,我们已将其限制为消除以下弃用项:
- 73750 删除不建议使用的BinaryMessageshttps://github.com/flutter/flutter/pull/73750
- 73751 删除不推荐使用的 `TypeMatcher`类 :https://github.com/flutter/flutter/pull/73751
## 概括
Play商店中有八分之一以上的新应用是使用 Flutter 构建,仅 Play 商店中有超过 20 万个Flutter 应用,这样的持续增长令人震惊,世界各地各种规模的应用程序都将其 UI 委托给Flutter以打造精美的多平台体验以迎合他们所处的任何地方的用户。

364
Flutter-250.md Normal file
View File

@ -0,0 +1,364 @@
> 原文链接 https://medium.com/flutter/whats-new-in-flutter-2-5-6f080c3f3dc
**Flutter 2.5 是 Flutter 版本历史上排名第二的大版本更新**,该版本:
- 关闭了 4600 个 issues
- 合并了 252 contributors 和 216 reviewers 的 3932 个 PR
回顾过去一年,可以看到有 1337 位 contributors 创建了 21,072 个 PR 这样庞大的数据其中有15,172 个被合并。
事实上该版本依然是对性能和开发工具进行了改进,同时还有增加许多新功能,包括:
- 对 Android 的全屏支持、更多 Material You也称为 v3支持
- 更新文本编辑功能以支持可切换的键盘快捷键;
- Widget Inspector 可查阅更多详细信息;
- Visual Studio Code 项目中对添加依赖项增加新的支持;
- IntelliJ/Android Studio 中新增测试运行获取覆盖率信息;
- 一个全新的应用程序模板,为 Flutter 应用程序提供更好的开发基础;
## 性能iOS 着色器预热、异步任务、GC 和消息传递
[#25644](https://github.com/flutter/engine/pull/25644) 中的第一个 PR 就是**用于离线训练运行 Metal 着色器预编译**,如基准测试所示,它将最坏情况的帧光栅化时间减少了 2/3 秒,将第 99 个百分位帧减少了一半。
然而着色器预热只是卡顿的来源之一,在**之前的版本处理来自网络、文件系统、插件或其他 isolate 的异步事件都可能会中断动画**,这是另一个卡顿的来源。
所以 [#25789](https://github.com/flutter/engine/pull/25789) 改进了调度策略,在此版本 isolate 的 UI 事件循环里,帧处理现在优先于处理其他异步事件,从而在测试中消除了此类的卡顿。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image1)
另一个导致卡顿的原因是**垃圾收集器 (GC) 暂停 UI 线程以回收内存**。
以前某些图像的内存在响应 Dart VM 的 GC 执行时会延迟回收作为早期版本中的解决方法Flutter 引擎会通过 Dart VM 的 GC 回收暗示图像内存可以回收,这在理论上可以实现了更及时的内存回收。
不幸的是这也导致了太多的主要 GC并且有时仍然无法足够快地回收内存以避免内存受限设备上的低内存情况而**在这个版本中未使用的图像的内存被急切地回收**[#26219](https://github.com/flutter/engine/pull/26219)、[#82883](https://github.com/flutter/flutter/pull/82883)、[#84740](https://github.com/flutter/flutter/pull/84740)),大大减少了 GC。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image2)
例如在一项测试用例中,**播放 20 秒动画 GIF 从需要 400 多次 GC 变为只需要 4 次**,更少的主要 GC 意味着涉及图像出现和消失的动画将减少卡顿,并消耗更少的 CPU 和功率。
Flutter 2.5 的另一个性能改进是在 **Dart 和 Objective-C/Swift (iOS) 或 Dart 和 Java/Kotlin (Android) 之间发送消息时的延迟。**
通常作为[调整](https://docs.google.com/document/d/1oNLxJr_ZqjENVhF94-PqxsGPx0qGXx-pRJxXL6LSagc/edit#heading=h.9gabvat7tlxf) 消息频道的一部分,从消息编解码器中删除不必要的副本可将延迟减少高达 50% ,当然具体取决于消息大小和设备([#25988](https://github.com/flutter/engine/pull/25988)[#26331](https://github.com/flutter/engine/pull/26331))。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image3)
> 你可以在此链接获取到更多关于平台通道性能的信息: https://medium.com/flutter/improving-platform-channel-performance-in-flutter-e5b4e5df04af
## Dart 2.14:格式、语言特性、发布和 linting 开箱即用
此版本的 Flutter 和 Dart 2.14 一起发布。
[新版本的 Dart](https://medium.com/@mit.mit/announcing-dart-2-14-b48b9bb2fb67) 带有新的格式,使[级联](https://dart.dev/guides/language/language-tour#cascade-notation) 更加清晰,**新的 pub 支持忽略文件,以及新的语言功能,包括三重移位运算符的回归**。
**此外 Dart 2.14 创建了一组标准的 lint在新的 Dart 和 Flutter 项目之间共享,开箱即用**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image4)
开发者不仅会在创建新的 Dart 或 Flutter 项目时获得这些 lint而且只需几个步骤就可以将相同的分析添加到现有应用程序中。
> 合并迁移linthttps://flutter.dev/docs/release/breaking-changes/flutter-lints-package#migration-guide
>
> 有关这些 lint 的详细信息、新语言功能等,请查看 https://medium.com/dartlang/announcing-dart-2-13-c6d547b57067
## FrameworkAndroid 全屏、Material You & 文本编辑快捷方式
从 [#81303](https://github.com/flutter/flutter/pull/81303) 开始, [我们修复了 Android 一系列与全屏模式相关的问题](https://github.com/flutter/flutter/pull/81303),此更改还添加了一种在其他模式下收听全屏更改的方法。
> 例如用户与应用互动时,当系统 UI 返回时,**开发人员现在可以编写代码在返回全屏时执行其他操作**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image5)
> *新的 Android 全屏模式:普通模式(左)、边到边模式(中)、带有自定义 SystemUIOverlayStyle 的边到边(右)*
在此版本中,我们对新 Material You又名 v3的规范增加了支持**包括对浮动操作按钮大小和主题的更新**[#86441](https://github.com/flutter/flutter/pull/86441)),在`MaterialState.scrolledUnder` 可以使用 Demo 中的示例代码查看的新状态 PR 式例 ( [#79999](https://github.com/flutter/flutter/pull/79999) )。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image6)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image7)
> *新的 MaterialState.scrolledUnder 状态在起作用*
另一个改进是**添加了 scroll metrics notifications**[#85221](https://github.com/flutter/flutter/pull/85221)、[#85499](https://github.com/flutter/flutter/pull/85499)),即使用户没有滚动,它也会提供可滚动区域的通知,例如下面显示了 `ListView` 根据的基础大小适当地出现或消失滚动条:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image8)
在这种情况下不必编写任何代码,但如果想捕获 `ScrollMetricNotification` 更改,则可以通过此监听来完成。
> 特别感谢社区贡献者[xu-baoolin](https://github.com/xu-baolin),他为此付出了努力并提出了一个很好的解决方案。
另一个出色的社区贡献是为 `ScaffoldMessenger` 你可能还记得 Flutter 2.0 开始 `ScaffoldMessenger` 作为一个更强大的方式来显示 `SnackBars` 在屏幕的底部为用户提供通知,而在 **Flutter 2.5 中,现在可以在 `Scaffold` 的顶部添加一个横幅**,该横幅会一直保持到用户关闭它为止。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image9)
应用程序可以通过调用以下 `showMaterialBanner` 方法来获得此行为 `ScaffoldMessenger`
```dart
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: const Text('The MaterialBanner is below'),
),
body: Center(
child: ElevatedButton(
child: const Text('Show MaterialBanner'),
onPressed: () => ScaffoldMessenger.of(context).showMaterialBanner(
MaterialBanner(
content: const Text('Hello, I am a Material Banner'),
leading: const Icon(Icons.info),
backgroundColor: Colors.yellow,
actions: [
TextButton(
child: const Text('Dismiss'),
onPressed: () => ScaffoldMessenger.of(context)
.hideCurrentMaterialBanner(),
),
],
),
),
),
),
);
}
```
[Material 指南规定](https://material.io/components/banners#usage) 开发者的应用[横幅](https://material.io/components/banners#usage)一次只能显示一个,因此如果你调用多次 `showMaterialBanner``ScaffoldMessenger` 它将维护一个队列,在前一个横幅已被关闭之后,再显示一个新横幅。
> 感谢 [Calamity210](https://github.com/Calamity210) 对 Flutter 中的 Material 支持做出了如此出色的补充!
在此版本中,我们添加了**文本编辑键盘快捷键可覆盖的功能** [#85381](https://github.com/flutter/flutter/pull/85381),这是在 Flutter 2.0 及其新的文本编辑功能的基础上进一步构建,例如文本选择以及能够在处理键盘事件后停止它的传播。
> 如果您希望 **Ctrl-A** 执行一些自定义操作而不是选择所有文本。
`DefaultTextEditingShortcuts` 类包含每个平台上受支持的键盘快捷键列表,如果开发者想覆盖任何内容,可以使用 Flutter 的现有 `Shortcuts` 将任何快捷方式重新映射到现有或自定义意图。
> API 参考: https://api.flutter.dev/flutter/widgets/DefaultTextEditingShortcuts-class.html
## 插件:相机、图像选择器和 plus 插件
另一个具有有很多改进的插件是[相机插件](https://pub.dev/packages/camera)
- [#3795](https://github.com/flutter/plugins/pull/3795) [相机] android-rework 第 1 部分:支持 Android 相机功能的基类
- [#3796](https://github.com/flutter/plugins/pull/3796) [相机] android-rework 第 2 部分Android 自动对焦功能
- [#3797](https://github.com/flutter/plugins/pull/3797) [camera] android-rework part 3Android曝光相关功能
- [#3798](https://github.com/flutter/plugins/pull/3798) [相机] android-rework 第 4 部分Android 闪光和变焦功能
- [#3799](https://github.com/flutter/plugins/pull/3799) [相机] android-rework 第 5 部分Android FPS 范围、分辨率和传感器方向功能
- [#4039](https://github.com/flutter/plugins/pull/4039) [相机] android-rework 第 6 部分Android 曝光和焦点功能
- [#4052](https://github.com/flutter/plugins/pull/4052) [camera] android-rework part 7Android降噪功能
- [#4054](https://github.com/flutter/plugins/pull/4054) [相机] android-rework 第 8 部分:最终实现的支持模块
- [#4010](https://github.com/flutter/plugins/pull/4010) [camera] 在 iOS 上不触发设备方向
- [#4158](https://github.com/flutter/plugins/pull/4158) [相机] 修复坐标旋转以在 iOS 上设置焦点和曝光点
- [#4197](https://github.com/flutter/plugins/pull/4197) [相机] 修复相机预览并不总是在方向改变时重建
- [#3992](https://github.com/flutter/plugins/pull/3992) [camera] 设置不受支持的 FocusMode 时防止崩溃
- [#4151](https://github.com/flutter/plugins/pull/4151) [camera] 引入camera_web包
[image_picker 插件](https://pub.dev/packages/image_picker) 也做了很多工作,专注于端到端的相机体验:
- [#3898](https://github.com/flutter/plugins/pull/3898) [image_picker] 图像选择器修复相机设备
- [#3956](https://github.com/flutter/plugins/pull/3956) [image_picker] 将相机捕获的存储位置更改为 Android 上的内部缓存,以符合新的 Google Play 存储要求
- [#4001](https://github.com/flutter/plugins/pull/4001) [image_picker] 删除了对相机权限的冗余请求
- [#4019](https://github.com/flutter/plugins/pull/4019) [image_picker] 当相机是 source 时修复旋转
这项工作改进了 Android 的相机和 image_picker 插件的功能和稳健性。
此外你会注意到 [摄像头插件](https://pub.dev/packages/camera_web) 的早期版本可用于网络支持 ( [#4151](https://github.com/flutter/plugins/pull/4151) )。
此预览为在 Web 上查看相机预览、拍照、使用闪光灯和缩放控件提供基本支持,它目前还不是被[认可的插件](https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin),因此您需要[明确添加它](https://pub.dev/packages/camera_web/install)以在才能在 web 中使用。
> 详细内容: https://pub.dev/packages/camera_web/install
在此版本的 Flutter 中Flutter 团队的每个相应插件现在都带有一个类似 [电池](https://pub.dev/packages/battery) 的建议:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image10)
此外,由于这些插件不再被积极维护,它们不再被标记为 Flutter 最喜欢的插件,我们建议使用以下插件的 plus 版本:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image11)
## Flutter DevTools性能、Widget 检查器和 Polish
首先最重要的是 DevTools 中增加利用引擎更新的支持([#26205](https://github.com/flutter/engine/pull/26205)、[#26233](https://github.com/flutter/engine/pull/26233)、[#26237](https://github.com/flutter/engine/pull/26237)、[#26970](https://github.com/flutter/engine/pull/26970)、[#27074](https://github.com/flutter/engine/pull/27074)、[#26617](https://github.com/flutter/engine/pull/26617))。
其中一组更新使 **Flutter 能够更好地将跟踪事件与特定框架相关联**,这有助于开发人员确定框架可能超出预算的原因。
可以在 DevTools Frames 图表中看到这一点,该图表已被重建为“实时”,可以在应用程序呈现时填充在此图表中,从此图表中选择一个帧导航到该帧的时间线事件:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image12)
Flutter 引擎现在还可以识别时间线中的着色器编译事件Flutter DevTools 使用这些事件来帮助诊断应用程序中的着色器编译卡顿。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image13)
借助这项新功能DevTools 会检测何时因着色器编译丢失帧,以便可以解决卡顿问题。
`flutter run` 时与 `--purge-persistent-cache` 标志一起使用,这会清除缓存以确保重现用户在 “首次运行” 或 “重新打开” (iOS) 体验中看到的环境。
> 此功能仍在开发中如果有任何问题可以查阅https://b.corp.google.com/issues/new?component=775375&template=1369639
此外跟踪应用程序中的 CPU 性能问题时,可能会被来自 Dart 和 Flutter 库或引擎本机代码的分析数据淹没,如果想关闭其中任何一个以专注于您自己的代码,您可以**使用新的 CPU Profiler 功能 [#3236](https://github.com/flutter/devtools/pull/3236) 来实现,该功能可以从这些来源中隐藏分析器信息**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image14)
对于没有过滤掉的任何类别,它们现在已经进行了颜色编码([#3310](https://github.com/flutter/devtools/pull/3310)、[#3324](https://github.com/flutter/devtools/pull/3324)),以便可以轻松查看 **CPU 帧图表来自系统的哪些部分**
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image15)
> 彩色框架图用于识别应用中的应用、原生、Dart 和 Flutter 代码活动
性能并不时调试的唯一因素,此版本的 DevTools 附带了对 Widget Inspector 的更新,**允许将鼠标悬停在 Widget 时评估对象、视图属性、小部件状态等**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image16)
而当选择一个 Widget 时,它会自动填充在新的小部件检查器控制台中,这样就可以在其中浏览 Widget 的属性。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image17)
**在断点处暂停时还可以从控制台计算表达式**。
除了新功能外 Widget Inspector 还进行了翻新,为了让 DevTools 成为了解和调试 Flutter 应用程序的更有用,我们与芬兰的一家创意技术机构[Codemate](https://codemate.com/)合作进行了一些更新。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image18)
在此屏幕截图中可以看到以下更改:
- **更好地传达调试切换按钮的作用**——这些按钮具有新图标、面向任务的标签,以及描述它们的作用和何时使用它们的丰富工具提示,每个工具提示进一步链接到该功能的详细文档。
- **更容易扫描和定位感兴趣的 Widgets**——Flutter 框架中常用的 Widget 现在在检查器左侧的 Widget 树视图中显示图标,它们根据类别进一步进行颜色编码,例如布局 Widget 显示为蓝色而内容Widget 显示为绿色。此外每个文本 Widget 现在显示其内容的预览。
- **对齐布局资源管理器和小部件树的配色方案**- 现在可以更轻松地从布局资源管理器和 Widget 树中识别相同的 Widget。例如屏幕截图中的“列” Widget 位于布局浏览器中的蓝色背景上,并且在 Widget 树视图中具有蓝色图标。
## IntelliJ/Android Studio集成测试、测试覆盖率和图标预览
Flutter 的 IntelliJ/Android Studio 插件在此版本中也进行了许多改进,首先是运行集成测试的能力 ( [#5459](https://github.com/flutter/flutter-intellij/pull/5459) )。
集成测试是在设备上运行的整个应用程序测试,位于 integration_test 目录中,并使用与`testWidgets()` 单元测试相同的功能。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image19)
要将集成测试添加到项目,请 [按照 flutter.dev 上的说明进行操作](https://flutter.dev/docs/testing/integration-tests),要将测试与 IntelliJ 或 Android Studio 连接,请添加启动集成测试的运行配置并连接设备以供测试使用,运行配置可以让开发者运行测试,包括设置断点、步进等。
此外Flutter 最新的 IJ/AS 插件允许查看单元测试和集成测试运行的覆盖率信息,可以从“调试”按钮旁边的工具栏按钮访问它:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image20)
覆盖信息在编辑器的装订线中使用红色和绿色条显示,在这个例子中第 9-13 行被测试,但第 3 和 4 行没有被测试。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image21)
最新版本还包括预览来自 pub.dev 包中使用的图标的新功能,这些包是围绕 TrueType 字体文件([#5504](https://github.com/flutter/flutter-intellij/pull/5504)、[#5595](https://github.com/flutter/flutter-intellij/pull/5595)、[#5677](https://github.com/flutter/flutter-intellij/pull/5677)、[#5704](https://github.com/flutter/flutter-intellij/pull/5704))构建的,就像 Material 和 Cupertino 图标支持预览一样。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image22)
要启用图标预览您需要告诉插件您正在使用哪些软件包settings/preferences 中有一个新的文本字段:
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image23)
请注意,如屏幕截图中的示例代码所示,此设置仅适用于在类中定义为静态常量的图标,它不适用于表达式,例如 `LineIcons.addressBook()` or `LineIcons.values['code']`
## Visual Studio Code依赖项、Fix All 和 Test Runner
Flutter 的 Visual Studio Code 插件也在此版本中得到了改进,两个新命令 “Dart: Add Dependency” and “Dart: Add Dev Dependency” ([#3306](https://github.com/Dart-Code/Dart-Code/issues/3306), [#3474](https://github.com/Dart-Code/Dart-Code/issues/3474))。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image24)
这些命令提供的功能类似于[Jeroen Meijer 的 Pubspec Assist 插件](https://marketplace.visualstudio.com/items?itemName=jeroen-meijer.pubspec-assist),新命令开箱即用,并提供定期从 pub.dev 获取的包类型过滤列表。
开发者可能还对适用于 Dart 文件的“Fix All”命令[#3445](https://github.com/Dart-Code/Dart-Code/issues/3445)、[#3469](https://github.com/Dart-Code/Dart-Code/issues/3469))感兴趣,并且可以一步修复所有与[dart fix](https://dart.dev/tools/dart-fix)相同的问题。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image25)
这也可以通过添加 `source.fixAll``editor.codeActionsOnSave` 的 VS Code 设置来设置为在保存时运行,或者想尝试预览功能,可以启用该 `dart.previewVsCodeTestRunner` 设置并查看通过新的 Visual Studio Code 测试运行程序运行的 Dart 和 Flutter 测试。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image26)
Visual Studio Code 测试运行器看起来与当前的 Dart 和 Flutter 测试运行器略有不同它将跨会话保留结果。Visual Studio Code 测试运行器还添加了新的装订线图标,显示测试的最后状态,可以单击以运行测试(或右键单击以获取上下文菜单)。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image27)
在即将发布的版本中,现有的 Dart 和 Flutter 测试运行器将被移除,以支持新的 Visual Studio Code 测试运行器。
## 工具:异常、新应用模板和 Pigeon 1.0
在此版本中,调试器现在可以在未处理的异常上正确中断,而这些异常以前时被 framework 捕获 ( [#17007](https://github.com/flutter/flutter/issues/17007) )。
这改善了调试体验,**因为调试器现在可以直接指向他们在代码中的抛出行,而不是指向框架深处的随机行。**
一个相关的新功能使开发者能够决定 FutureBuilder 是否应该重新抛出或吞下错误 ([#84308](https://github.com/flutter/flutter/pull/84308)),这应该会为开发者提供大量额外的例外情况,以帮助追踪 Flutter 应用程序中的问题。
自 Flutter 诞生以来,就出现了 Counter 应用模板,它具有许多优点:
- 它展示了 Dart 语言的许多特性;
- 展示了几个关键的 Flutter 概念,并且它足够小;
- 可以放入单个文件中,即使有很多的解释性评论;
然而它没有为Flutter 应用程序提供一个特别好的起点,在此版本中,通过以下命令提供了一个新模板 ( [#83530](https://github.com/flutter/flutter/pull/83530) )
`$ flutter create -t skeleton my_app`
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image28)
骨架模板生成一个遵循社区最佳实践的两页列表视图,它的开发经过大量内部和外部审查,为构建生产质量应用程序提供了更好的基础,并支持以下功能:
- 用于 `ChangeNotifier` 协调多个 Widget
- 默认情况下使用 arb 文件生成本地化
- 包括示例图像并为图像资产建立 1x、2x 和 3x 文件夹
- 使用“功能优先”的文件夹组织
- 支持共享首选项
- 支持明暗主题
- 支持多页面间导航
随着时间的推移,随着 Flutter 最佳实践的发展预计这个新模板也会随之发展。
另一方面,**如果你正在开发插件而不是应用程序,那么可能会对 Pigeon 的 1.0 版本感兴趣**。
Pigeon 是一个代码生成工具,用于在 Flutter 及其主机平台之间生成类型安全的互操作代码,它允许定义插件 API 的描述,并为 Dart、Java 和 Objective-C分别可用于 Kotlin 和 Swift生成框架代码。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-250/image29)
Flutter 团队的一些插件中已经使用了 Pigeon在此版本中它提供了更多有用的错误消息增加了对泛型、原始数据类型作为参数和返回类型以及多个参数的支持预计开发者将来会更频繁地使用它。
## 重大更改和弃用
以下是 Flutter 2.5 版本中的重大变化:
- [默认拖动滚动设备](https://flutter.dev/docs/release/breaking-changes/default-scroll-behavior-drag)
- [在 v2.2 之后删除了弃用的 API](https://flutter.dev/docs/release/breaking-changes/2-2-deprecations)
- [引入包flutter_lints](https://flutter.dev/docs/release/breaking-changes/flutter-lints-package)
- [ThemeData 的 accent 属性已被弃用](https://flutter.dev/docs/release/breaking-changes/theme-data-accent-properties)
- [GestureRecognizer Cleanup](https://flutter.dev/docs/release/breaking-changes/gesture-recognizer-add-allowed-pointer)
- [用 collate 替换 AnimationSheetBuilder.display](https://flutter.dev/docs/release/breaking-changes/animation-sheet-builder-display)
- [使用 HTML 插槽在 Web 中呈现平台视图](https://flutter.dev/docs/release/breaking-changes/platform-views-using-html-slots-web)
- [将 LogicalKeySet 迁移到 SingleActivator](https://github.com/flutter/flutter/pull/80756)
随着继续更新 Flutter Fix在您的 IDE 中和通过`dart fix`命令可用),总共有 157 条规则来自动迁移受这些或过去的重大更改以及任何弃用影响的代码。
此外随着 Flutter 2.5 的发布,**我们将弃用[2020 年 9 月宣布的](http://flutter.dev/go/rfc-ios8-deprecation)对 iOS 8 的支持**。放弃对市场份额不到 1% 的 iOS 8 的支持,使 Flutter 团队能够专注于更广泛使用的新平台,弃用意味着这些平台可以工作,但我们不会在这些平台上测试 Flutter 的新版本或插件。
> 您可以在 flutter.dev 上查看当前支持的 Flutter 平台列表: https://flutter.dev/docs/development/tools/sdk/release-notes/supported-platforms

256
Flutter-280.md Normal file
View File

@ -0,0 +1,256 @@
> 原文链接https://medium.com/flutter/whats-new-in-flutter-2-8-d085b763d181
欢迎来到 Flutter 2.8!该版本包含了 207 位 contributors 和 178 位 reviewers 的内容,其中一共有 2,424 个合并的 PR并 Closed 了 2976 个问题。
与往常一样Flutter 的工作的第一位就是保证质量,我们花费了大量时间来确保 Flutter 在支持的设备范围内可以尽可能平稳和稳健地运行。
## Startup
**该版本改进了应用的启动延迟问题**,这个改进在 Google Pay 中进行了, Google Pay 作为一个主流的大型应用程序,代码超过 100 万行,使用它进行测试可以确保这些更改所产生的影响是可以被感知的。
**所有这些改进使得 Google Pay 在低端 Android 设备上运行时的启动延迟降低了 50%,在高端设备上降低了 10%**。
Flutter 通过影响 Dart VM 的垃圾收集策略的方式,可以有助于避免在应用启动期间出现不合时宜的 GC 。
> 例如在 Android 上渲染第一帧之前Flutter 现在 [只通知 Dart VM `TRIM_LEVEL_RUNNING_CRITICAL` 及以上的内存压力信号](https://github.com/flutter/flutter/issues/90551),在本地测试中,这个更改将低端设备上的第一帧时间减少了多达 300 毫秒。
出于[严谨的考虑](https://github.com/flutter/engine/pull/29145#pullrequestreview-778935616),在之前的版本中 Flutter 创建平台视图时会阻塞平台线程,这次通过[详细的推理和测试](https://github.com/flutter/flutter/issues/91711) 确定了可以删除一些序列化,这个改进消除了在低端设备上启动 Google Pay 期间超过 100 毫秒的阻塞。
另外,以前设置默认字体管理器时,会在设置第一个 Dart isolate 时添加人为的延迟,而[延迟默认字体管理器](https://github.com/flutter/engine/pull/29291) 和 Dart `Isolate` 设置,这样既改善了启动延迟,又使上述优化的效果更加明显。
## # Memory
由于 Flutter 频繁地加载 Dart VM 的 “service isolate”这部分 AOT 代码与应用程序捆绑在一起,因此 Flutter 会同时将这两者都读入内存,因此针对内存受限的设备, Flutter 开发人员在进行性能跟踪时[遇到了问题](https://github.com/flutter/flutter/issues/91382)。
在 2.8 版本中针对 Android 设备, Dart VM 的 service isolate [被拆分为](https://github.com/flutter/engine/pull/29245)可以单独加载的[自己的包](https://github.com/flutter/engine/pull/29245),这样的调整让设备可节省最多 40 MB 的内存。
通过[ Dart VM informing the OS ](https://github.com/flutter/flutter/issues/92120),内存占用进一步减少了 10% AOT 程序使用的内存将可能不需要再次读取文件,因此,之前保存文件备份数据副本的页面可以被回收并用于其他用途。
## Profiling
以便更好地了解应用程序中的性能问题在应用程序启动时启用2.8 版本现在会将跟踪事件发送到 `Android systrace` 记录器,即使 Flutter 应用程序构建在发布模式下也会发送这些事件。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image1)
此外为了创建更少卡顿的动画效果,开发者可能会想要更多关于光栅缓存行为的性能跟踪信息,因为这个行为对于 Flutter 来说是比较昂贵的,**可以重复使用的图片进行 blit 而不是在每一帧上重新绘制它们,在性能跟踪中的新事件流现在允许跟踪光栅缓存图片的生命周期**。
## Flutter DevTools
对于调试性能问题,**该版本的 `DevTools` 添加了一个新的“Enhance Tracing”功能它可以帮助开发者诊断因昂贵的构建、布局和绘制操作而导致的 UI 卡顿**。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image2)
启用这些跟踪功能中的任何一个后,时间轴将包含用于构建的 Widget、布置的渲染对象和绘制渲染对象的新事件视情况而定
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image3)
**此外该版本的 `DevTools` 增加了分析应用程序启动性能的支持**,该配置文件包含从 Dart VM 初始化到第一个 Flutter 帧渲染的 CPU 样本。
在按下 “Profile app start up” 按钮并加载应用程序启动配置文件后,开发者将看到为配置文件选择的 “AppStartUp” 用户标签,另外还可以通过在可用用户标签列表中,选择此用户标签过滤器(如果有)来加载应用程序启动配置文件。
> 选择此标签会显示应用启动的配置文件数据。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image4)
## Web platform views
**Android 和 iOS 并不是唯一获得性能改进的平台,该版本还改进了 Flutter web 平台的性能**。
Flutter Web 使用 `HtmlElementView` Widget 实现了这一点,它允许开发者在 Flutter Web 应用程序中托管 HTML 元素。
如果开发者使用的是 google_maps_flutter 插件或 video_player 插件的 web 版本,或者你已经遵循了 Flutter 团队关于[如何优化网络上显示图像的建议](https://docs.flutter.dev/development/platform-integration/web-images#use-img-in-a-platform-view),那么您其实已经在使用 platform views。
在之前版本的 Flutter 中platform view 会立即创建一个新的画布,每个额外的平台视图都会添加另一个画布,可是创建额外的画布是很昂贵的,因为每个画布都是整个窗口的大小。
**所以该版本会复用早期平台视图创建的画布**,这意味着开发者可以在 `HtmlElementView` 的 Web 应用中拥有多个实例而不会降低性能,同时还可以减少使用平台视图时的滚动卡顿。
## WebView 3.0
**这次 `webview_flutter` 的另一个新版本是,这里提高了版本号,是因为新功能的数量增加了,而且还因为 Web 视图在 Android 上的工作方式可能发生了重大变化**。
在之前的版本中, `webview_flutter` 的 hybrid composition 模式已经可用,但并不是默认设置。
hybrid composition 修复了先前默认 virtual displays 模式存在的许多问题,根据用户反馈和问题跟踪的结果,我们认为是时候让 hybrid composition 成为默认设置了,另外 `webview_flutter` 还增加了一些要求很高的功能:
- 支持 POST 和 GET 来填充内容([4450](https://github.com/flutter/plugins/pull/4450)、[4479](https://github.com/flutter/plugins/pull/4479)、[4480](https://github.com/flutter/plugins/pull/4480)、[4573](https://github.com/flutter/plugins/pull/4573)
- 从文件和字符串([4446](https://github.com/flutter/plugins/pull/4446)、[4486](https://github.com/flutter/plugins/pull/4486)、[4544](https://github.com/flutter/plugins/pull/4544)、[4558](https://github.com/flutter/plugins/pull/4558))加载 HTML
- 透明背景支持([3431](https://github.com/flutter/plugins/pull/4569)、[3431](https://github.com/flutter/plugins/pull/4569)、[4570](https://github.com/flutter/plugins/pull/4570)
- 在加载内容之前编写 cookie[4555](https://github.com/flutter/plugins/pull/4555)、[4555](https://github.com/flutter/plugins/pull/4556)、[4557](https://github.com/flutter/plugins/pull/4557)
此外在 3.0 版本中,`webview_flutter` 为新平台提供了初步支持web这个支持允许开发者从单个代码库构建 mobile 和 web 应用,在 Flutter Web 应用程序中托管 Web 视图是什么样的?从代码的角度来看它看起来是一样的:
```dart
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上运行时它也会按开发者的预期工作
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image5)
请注意,**其实当前的 `webview_flutter` for web 的实现还有许多限制,因为它是使用 构建的 `iframe` 实现的**。
它仅支持简单的 URL 加载,无法控制加载的内容或者和加载的内容交互
> 有关更多信息,请查看 [webview_flutter_web Readme](https://pub.dev/packages/webview_flutter_web)
但是 `webview_flutter_web` 由于太收欢迎,我们将作为 [未经认可的插件提供](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#endorsed-federated-plugin),如果你想尝试一下,请将以下行添加到 pubspec.yaml 中:
```yaml
dependencies:
webview_flutter: ^3.0.0
webview_flutter_web: ^0.1.0 # add unendorsed plugin explicitly
```
## Flutter Favorites
Flutter Ecosystem Committee 生态系统委员会再次召开会议,指定以下 Flutter Favorites 包:
- 三种自定义路由器包:[`beamer`](https://pub.dev/packages/beamer)[`routemaster`](https://pub.dev/packages/routemaster) 和 [`go_router`](https://pub.dev/packages/go_router)
- [`drift`](https://pub.dev/packages/drift),一个功能强大且流行的 Flutter 和 Dart 响应式持久化库的重命名,构建在 `sqlite`
- [`freezed`](https://pub.dev/packages/freezed),一个 Dart “语言补丁” 为定义模型、克隆对象、模式匹配等提供简单的语法
- [`dart_code_metrics`](https://pub.dev/packages/dart_code_metrics)
- 几个非常好看的图形用户界面包:[`flex_color_scheme`](https://pub.dev/packages/flex_color_scheme)[`flutter_svg`](https://pub.dev/packages/flutter_svg)[`feedback`](https://pub.dev/packages/feedback)[`toggle_switch`](https://pub.dev/packages/toggle_switch),和 [`auto_size_text`](https://pub.dev/packages/auto_size_text)
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image6)
# 特定于平台的软件包
如果你是软件包作者,必须选择哪些平台是将支持的,如果正在使用特定于平台的本机代码构建插件,可以[使用](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-platforms)`pluginClass`[项目中的属性](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-platforms)来实现,[该](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-platforms)[属性](https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-platforms)`pubspec.yaml`指示提供功能的 native 类:
```yaml
flutter:
plugin:
platforms:
android:
package: com.example.hello
pluginClass: HelloPlugin
ios:
pluginClass: HelloPlugin
```
但是随着 [Dart FFI](https://dart.dev/guides/libraries/c-interop) 变得更加成熟,可以像 `path_provider_windows` 包一样在 100% Dart 中实现用于特定平台的功能,所以当没有任何本机类可以使用,但你仍想将你的包指定为仅支持某些平台时,请改用该`dartPluginClass` 属性:
```yaml
flutter:
plugin:
implements: hello
platforms:
windows:
dartPluginClass: HelloPluginWindows
```
使用这个配置后,即使没有任何 native 代码,也已将包指定为仅支持某些平台,另外还必须提供 Dart 插件类;可以在 flutter.dev 上的 Dart-only 平台实现文档中了解更多信息。
## Firebase
> 关于它的一系列升级和更新,很大一块,反正国内用不上,懒得写了
## Desktop
**Flutter 2.8 版本在 Windows、macOS 和 Linux 稳定版本的道路上又迈出了一大步。** 包括国际化和本地化支持,如最近的 中文IME支持、韩语IME支持和汉字IME支持。
一个为稳定版本准备的例子:完全重构 Flutter 处理键盘事件以允许同步响应,这使 Widget 能够处理按键并取消其在 tree 的其余部分中传播。
最初是在 Flutter 2.5 和 Flutter 2.8 中添加了对问题的回归和修复,这是重新设计处理特定于设备的键盘输入的方式,重构 Flutter 处理文本编辑方式来达到补充的目的,所有这些都是键盘输入密集型桌面应用程序所必需。
此外我们会继续扩展 Flutter 对视觉密度的支持并为对话框公开对齐方式,以实现更加桌面友好的 UI。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image7)
最后 Flutter 团队并不是唯一一个在 Flutter 桌面上工作的人举个例子Canonical 的桌面团队正在与 Invertase 合作,在 Linux 和 Windows 上实现最流行的 Flutter Firebase 插件。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image8)
## DartPad
DartPad 的改进,其中最大的改进是对更多包的支持,事实上现在有 23 个包可供导入,除了几个 Firebase 服务,该名单包含常用软件如 `bloc``characters``collection``google_fonts`,和 `flutter_riverpod` DartPad 团队会继续添加新的软件包,因此如果想查看当前支持哪些软件包,请单击右下角的信息图标。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image9)
还有另一个新的 DartPad 功能也非常方便。以前 DartPad 总是运行最新的稳定版本,在此版本中可以使用状态栏中的新频道菜单,来选择最新的 Beta 频道版本以及之前的稳定版本(称为“旧频道”)。
![](http://img.cdn.guoshuyu.cn/20211223_Flutter-280/image10)
## Removing the dev channel
Flutter “channel” 控制着底层 Flutter 框架和引擎在你的开发机器上变化的速度Stable 代表最少的问题,而 master 代表最多。
**由于资源限制,我们最近停止更新 `dev` channel**。虽然为此我们确实收到了一些关于此的问题,但我们发现只有不到 3% 的 Flutter 开发人员使用该`dev`渠道。
因此我们决定正式退役的进程`dev`渠道,因为很少有开发人员使用 dev 频道,但 Flutter 工程师需要花费大量时间和精力来维护它。
你可以使用该 `flutter channel` 命令决定想要哪个频道,以下是 Flutter 团队对每个频道的看法:
- `stable`频道代表我们拥有的最高质量的构建。它们每季度(大致)发布一次,并针对中间的关键问题进行热修复,这就是“慢”通道:安全、成熟、长期服务。
- `beta` 频道为那些习惯于更快节奏的人提供了一种快速移动的替代方案。目前每月发布。
- `master` 频道是我们活跃的开发频道,我们不提供对该频道的支持,但我们针对它运行了一套全面的单元测试。
`dev` 在未来几个月停用该频道时,请考虑 `beta``master `频道,具体取决于对问题的容忍度以及对最新和最好的需求。
## Breaking Changes
与往常一样我们都在努力减少每个版本中重大更改的数量在此版本中Flutter 2.8 除了已过期并根据我们的重大变更政策已被删除的已弃用 API 之外,没有重大变更:
- [90292](https://github.com/flutter/flutter/pull/90292)删除autovalidate弃用
- [90293](https://github.com/flutter/flutter/pull/90293)删除FloatingHeaderSnapConfiguration.vsync弃用
- [90294](https://github.com/flutter/flutter/pull/90294)删除AndroidViewController.id弃用
- [90295](https://github.com/flutter/flutter/pull/90295)删除BottomNavigationBarItem.title弃用
- [90296](https://github.com/flutter/flutter/pull/90296)删除不推荐使用的文本输入格式类
## 总结
**看完 Flutter 2.8 的更新,最主要是关于性能、稳定性和 WebView 的调整,本质上这个版本应该会比较友好,因为几乎没有 Breaking Changes ,所以值得一试,推荐等 2.8.3 之后的版本。**

View File

@ -79,6 +79,24 @@
* [二十一、 Flutter 画面渲染的全面解析](Flutter-21.md)
* **[Flutter SDK 更新集锦](UPDATE.md)**
Flutter
- [Flutter Interact 的 Flutter 1.12 大进化和回顾](Flutter-112.md)
- [Flutter 1.17 | 2020年度第一个稳定版本](Flutter-117.md)
- [Announcing Flutter 1.20](Flutter-120.md)
- [Flutter 2 正式版的新功能,一睹为快](Flutter-200.md)
- [Flutter 2.2 全新功能介绍](Flutter-220.md)
- [Flutter 2.5 发布啦,快来看看新特性](Flutter-250.md)
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
Dart
- [Dart 2.12 发布稳定空安全声明和FFI版本Dart 未来的计划](Dart-212.md)
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)
* [番外](FWREADME.md)
* [Flutter 跨平台框架应用实战-2019极光开发者大会](Flutter-jg-meet.md)

View File

@ -46,7 +46,26 @@
* [二十一、 Flutter 画面渲染的全面解析](Flutter-21.md)
* [番外]()
* **[Flutter SDK 更新集锦](UPDATE.md)**
Flutter
- [Flutter Interact 的 Flutter 1.12 大进化和回顾](Flutter-112.md)
- [Flutter 1.17 | 2020年度第一个稳定版本](Flutter-117.md)
- [Announcing Flutter 1.20](Flutter-120.md)
- [Flutter 2 正式版的新功能,一睹为快](Flutter-200.md)
- [Flutter 2.2 全新功能介绍](Flutter-220.md)
- [Flutter 2.5 发布啦,快来看看新特性](Flutter-250.md)
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
Dart
- [Dart 2.12 发布稳定空安全声明和FFI版本Dart 未来的计划](Dart-212.md)
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)
* [番外](FWREADME.md)
* [Flutter 跨平台框架应用实战-2019极光开发者大会](Flutter-jg-meet.md)
* [Flutter 面试知识点集锦](Flutter-msjj.md)

22
UPDATE.md Normal file
View File

@ -0,0 +1,22 @@
# Flutter SDK 和 Dart SDK 更新合集
## Flutter
- [Flutter Interact 的 Flutter 1.12 大进化和回顾](Flutter-112.md)
- [Flutter 1.17 | 2020年度第一个稳定版本](Flutter-117.md)
- [Announcing Flutter 1.20](Flutter-120.md)
- [Flutter 2 正式版的新功能,一睹为快](Flutter-200.md)
- [Flutter 2.2 全新功能介绍](Flutter-220.md)
- [Flutter 2.5 发布啦,快来看看新特性](Flutter-250.md)
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
## Dart
- [Dart 2.12 发布稳定空安全声明和FFI版本Dart 未来的计划](Dart-212.md)
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)