This commit is contained in:
guoshuyu 2022-08-31 11:29:39 +08:00
parent 437b71911e
commit ec13ab98e8
7 changed files with 715 additions and 2 deletions

View File

@ -1 +0,0 @@
{"http:V-8fqeyK7oW8wXIqEIi92CZ-ymENQfoEYcqExXAK:carguo": {"upHosts": ["http://up-z2.qiniu.com", "http://upload-z2.qiniu.com", "-H up-z2.qiniu.com http://14.29.110.6"], "ioHosts": ["http://iovip-z2.qbox.me"], "deadline": 1656381382}}

278
Dart-218.md Normal file
View File

@ -0,0 +1,278 @@
# Dart 2.18 发布Objective-C 和 Swift interop
> 原文链接: https://medium.com/dartlang/dart-2-18-f4b3101f146c
**Dart 2.18 版本开始提供与 Objective-C 和 Swift 交互的能力预览**,以及在这基础上构建的新 iOS / macOS 包支持。
**Dart 2.18 还包含对通用函数的类型推断改进、异步代码的性能改进、新的pub.dev 功能支持以及对工具和核心库的整理**。
最后,**还有最新的 *null safety* 迁移状态解析**,以及通往完全 *null safety* 的重要路线图更新。
![](http://img.cdn.guoshuyu.cn/20220831_# Dart/image1.png)
# Dart 支持与 Objective-C 和 Swift 交互的能力
在 2020 年的时候我们预览了用于调用原生 C API 的 Dart 外函数接口FFI并于 2021 年 3 月在 Dart 2.12 中发布了它。
自该版本发布以来大量软件包利用此功能与现有的原生C API集成例如 `file_picker`、`printing`、`win32`、`objectbox`、`realm`、`isar`、`tflite_flutter `和 `dbus ` 等。
**Dart 团队希望支持所运行平台上所有主要语言的交互能力,而 Dart 2.18达到了实现这一目标的下一个里程碑**。
在 2.18 Dart 代码可以调用 Objective-C 和 Swift 代码,这通常用于调用 macOS 和 iOS 平台上的APIDart在任何应用中都支持这种互操作机制从CLI 应用到后端代码和 Flutter UI。
这种新机制其实是利用了 Objective-C 和 Swift 代码可以基于 API 绑定 C 代码公开Dart API 包装了生成工具 `ffigen` ,可以从 API 标头创建这些绑定。
# 使用Objective-C的时区示例
macOS 有一个 API 可用于查询 `NSTimeZone` 上公开的时区信息,开发者可以查询该 API 以了解用户为其设备配置的时区和 UTC [时区偏移量](https://www.w3.org/International/core/2005/09/timezone.html#:~:text=What is a "zone offset,or "-" from UTC.)。
以下示例中 Objective-C 使用此时区 API 获取系统时区和GMT偏移量
```objective-c
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSTimeZone *timezone = [NSTimeZone systemTimeZone]; // Get current time zone.
NSLog(@"Timezone name: %@", timezone.name);
NSLog(@"Timezone offset GMT: %ld hours", timezone.secondsFromGMT/60/60);
}
return 0;
}
```
这里导入了 `Foundation.h`,其中包含 Apple Foundation 库的 API headers。
接下来,在 `main` 方法中,它从 `NSTimeZone` 类调用了 `systemTimeZone` 方法,此方法返回设备上选定时区的 `NSTimeZone` 实例。
最后应用向控制台输出两行结果其中包含时区名称和UTC偏移量以小时为单位
如果运行此程序,它应该会返回类似于以下内容的东西,具体取决于开发者的位置:
```
Timezone name: Europe/Copenhagen
Timezone offset GMT: 2 hours
```
# 使用 Dart 的时区示例
让我们使用新的 Dart 与 Objective-C 一起重新实现上面的结果。
首先创建一个新的 Dart CLI
```
$ dart create timezones
```
然后编辑 `pubspec `文件以包含 `ffigen` 配置,配置指向头文件,并列出了哪些 Objective-C 接口应该生成包装器:
```yaml
ffigen:
name: TimeZoneLibrary
language: objc
output: "foundation_bindings.dart"
exclude-all-by-default: true
objc-interfaces:
include:
- "NSTimeZone"
headers:
entry-points:
- "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/
Headers/NSTimeZone.h"
```
这就为 `NSTimeZone.h` 中的 headers 选择 Objective-C 绑定,并仅包括`NSTimeZone `接口中的API要生成 wrappers 可以允行 `ffigen`
```
$ dart run ffigen
```
该命令会创建一个新文件 `foundation_bindings.dart`其中包含一堆生成的API绑定使用该绑定文件就可以编写 Dart `main` 方法此方法镜像Objective-C 代码:
```dart
void main(List<String> args) async {
const dylibPath =
'/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation';
final lib = TimeZoneLibrary(DynamicLibrary.open(dylibPath));
final timeZone = NSTimeZone.getLocalTimeZone(lib);
if (timeZone != null) {
print('Timezone name: ${timeZone.name}');
print('Offset from GMT: ${timeZone.secondsFromGMT / 60 / 60} hours');
}
}
```
就这样,从 Dart 2.18 开始这种新的支持在实验状态下可用该能力增强了Dart 的交互支持,以直接调用 macOS 和 iOS API 支持。
并且这也反向补充了 Flutter 的插件,提供了允许开发者直接从 Dart 代码调用macOS 和 iOS API 的能力。
> 要了解有关这种互操作性的更多信息,请参阅 [Objective-C 和 Swift 交互指南](https://dart.dev/guides/libraries/objective-c-interop)。
# 特定于平台的http库
Dart 里包括一个通用的多平台`http`库,该库允许开着编写代码而无需考虑平台细节,但是有时候开发者可能希望编写特定于特定 native 平台的 网络 API的代码例如苹果的网络 库`NSURLSession `允许指定仅限 WiFi 或 VPN的网络。
为了支持这些用例,我们为 macOS 和 iOS 平台创建了一个新的网络包 `cupertino_http`,该能力建立在上一节中提到的 Objective-C 直接交互的基础上。
# Cupertino http library 示例
以下示例将 Flutter 的 http 客户端设置为在其他平台上使用 `cupertino_http`库,以及 `dart:io` 下的 http 库:
```dart
late Client client;
if (Platform.isIOS || Platform.isMacOS) {
final config = URLSessionConfiguration.ephemeralSessionConfiguration()
..allowsCellularAccess = false
..allowsExpensiveNetworkAccess = false;
client = CupertinoClient.fromSessionConfiguration(config);
} else {
client = Client(); // Uses an HTTP client based on dart:io
}
```
初始配置后,应用会对特定客户端进行后续网络调用,例如 http `get()` 请求现在类似于以下内容:
```dart
final response = await get(
Uri.https(
'www.googleapis.com',
'/books/v1/volumes',
{'q': 'HTTP', 'maxResults': '40', 'printType': 'books'},
),
);
```
当开发者无法使用通用客户端接口时,就可以直接使用 `cupertino_http` 库调用苹果的网络API
```dart
final session = URLSession.sessionWithConfiguration(
URLSessionConfiguration.backgroundSession('com.example.bgdownload'),
onFinishedDownloading: (s, t, fileUri) {
actualContent = File.fromUri(fileUri).readAsStringSync();
});
final task = session.downloadTaskWithRequest(
URLRequest.fromUrl(Uri.https(...))
..resume();
```
# 多平台应用程序中特定于平台的网络
在设计该功能时,目标仍然是使应用尽支持更多的平台,为了实现这个目标,我们为基本的 http 操作保留了通用的多平台 `http` API 集,并允许为每个平台配置要使用的网络库。
[`package:http`](https://pub.dev/documentation/http/latest/http/Client-class.html) 将需要编写的特定于平台的代码量降至最低,此 API 可以按平台配置,但以独立于平台的方式使用。
Dart 2.18 提供了对两个对于 `package:http` 特定于平台的 http 库的实验性支持:
- `cupertino_http` 基于 `NSURLSession` 的 macOS/iOS 支持。
- `cronet_http `基于 [Cronet](https://developer.android.com/guide/topics/connectivity/cronet)Android 上流行的网络库支持。
将一个通用客户端 API 与多个 HTTP 实现相结合,以获得特定于平台的行为,同时仍然从所有平台的一组共享源中维护应用。
# 改进的类型推断
Dart 使用了许多通用函数,例如 `fold`方法,它将元素集合减少为单个值,如计算整数列表的总和:
```dart
List<int> numbers = [1, 2, 3];
final sum = numbers.fold(0, (x, y) => x + y);
print(The sum of $numbers is $sum);
```
对于 Dart 2.17 或更早版本,这个方法返回类型错误:
```
line 2 • The operator + cant be unconditionally invoked because the receiver can be null.
```
**Dart 2.18 改进了类型推断,前面的示例通过了静态分析,可以推断出 x 和 y 都是不可为空的整数**,此更改允许开发者编写更简洁的 Dart 代码,同时保留强推断类型的完整可靠性属性。
# 异步性能改进
此版本的 Dart 改进了 Dart VM 应用 `async` 方法和 `async*`/`sync* `生成器功能的方式。
这减少了代码大小,在两个大型内部 Google 应用程序中,我们看到 AOT 快照大小减少了约 10%,还可以看到微基准测试的性能有所提高。
> 这些变化包括额外的小行为变化;要了解更多信息,请参阅[更改日志](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#dart-vm)。
# pub.dev 改进
结合 2.18 版本,我们对 `pub.dev`包 存储库进行了两项更改。
个人业余时间通过 `pub.dev` 维护和发布的可能会产生一些时间上的投入,为了促进赞助,我们现在在 中支持一个新 `funding` 标签,`pubspec`包发布者可以使用该标签列出指向一种或多种赞助包的方式的链接。然后这些链接显示`pub.dev`在侧边栏中:
![](http://img.cdn.guoshuyu.cn/20220831_# Dart/image2.png)
> 要了解更多信息,请参阅`pubspec`[文档](https://dart.dev/tools/pub/pubspec#funding)。
此外,我们希望鼓励丰富的开源软件包生态系统,为了突出这一点,自动包评分对使用 [OSI 批准的许可证](https://opensource.org/licenses) 的 `pub.dev`包额外奖励 10 分。
# 一些重大变化
Dart 非常注重简单和易学的能力,在添加新功能时,我们一直在努力保持谨慎的平衡。
保持简单的一种方法是删除历史功能和 APIDart 2.18 清理了此类别中的项目,包括一些较小的重大更改:
- 我们早在 2020 年 10 月就添加了统一的 `dart` CLI 开发人员工具,在 2.18 中我们完成了过渡。此版本删除了最后两个已弃用的工具 `dart2js` (use `dart compile js`) 和 `dartanalyzer` (use `dart analyze`)。
- 随着语言版本控制的引入,`pub `生成了一个新的解析文件:`.dart_tool/package_config.json` 。 之前的 `.packages` 文件使用了一种不能包含版本的格式,而现在我们停止使用 `.packages`文件,如果你有任何`.packages`文件,现在可以删除它们了。
- 不能使用未扩展的类的混合 `Object`(重大更改[#48167](https://github.com/dart-lang/sdk/issues/48167))。
- `dart:io``RedirectException``uri` 属性已更改为可为空(重大更改[#49045](https://github.com/dart-lang/sdk/issues/49045))。
- `dart:io `遵循 SCREAMING_SNAKE 约定的网络 API 中的常量已被删除(重大更改# [34218](https://github.com/dart-lang/sdk/issues/34218);以前已弃用),请改用相应的 lowerCamelCase 常量。
- Dart VM 在退出时不再恢复初始终端设置,更改 `Stdin` 设置 `lineMode``echoMode` 现在负责在程序退出时恢复设置(重大更改[#45630](https://github.com/dart-lang/sdk/issues/45630))。
# 空安全更新
自 2020 年 11 月发布测试版和 2021 年 3 月发布 [Dart 2.12](https://medium.com/dartlang/announcing-dart-2-12-499a6e689c87) 以来,我们很高兴看到 null 安全性的广泛使用。
首先,大多数流行包的开发人员都在 `pub.dev` 迁移到了零安全性分析表明100% 的前 250 个和 98% 的前 1000 个最常用的包支持零安全。
其次,大多数应用开发人员在具有完全空安全迁移的代码库中工作,这是至关重要的条件,在迁移所有代码和所有依赖项(包括传递性)之前, Dart [健全的 null safety](https://dart.dev/null-safety/understanding-null-safety) 不会发挥作用。
下图显示了 `flutter run` 在引入零安全和没有引起之间的对比,随着应用开始迁移到零安全,开发人员进行了部分迁移,但仍存在部分内容未迁移到 null safety。
随着时间的推移可以看到, null safety 使用在健康地增长。到上月底,与不使用 null safety 相比, null safety 多出四倍,所以我们希望,在接下来的几个季度中,我们将看到 100% 的可靠零安全方法。
![](http://img.cdn.guoshuyu.cn/20220831_# Dart/image3.png)
# 重要的零安全路线图更新
同时支持空安全和非空安全会增加开销和复杂性。
首先Dart 开发者需要学习和理解这两种模式,每当阅读一段 Dart 代码时,检查[语言版本](https://dart.dev/guides/language/evolution#language-versioning)以查看类型是否默认为非空Dart 2.12 及更高版本或默认可空Dart 2.11 及更早版本)。
其次,在我们的编译器和运行时同时支持这两种模式会减慢 Dart SDK 的发展以支持新功能。
**基于非空安全的开销和上一节中提到的非常积极的采用数字,我们的目标是过渡到仅支持可靠的空值安全,并停止非空值安全和不健全的空值安全模式,我们暂时将其定于 2023 年年中发布**。
**这将意味着停止对 Dart 2.11 及更早版本的支持**,具有低于 2.12 的 SDK 约束的 Pubspec 文件将不再在 Dart 3 及更高版本中解析。
> 在包含语言标记的源代码中,如果设置为小于 2.12(例如`// @dart=2.9`)也会失败。
如果已迁移到可靠的 null 安全性,那么你的代码将在 Dart 3 中以完全的 null 安全性工作,如果还没有,请立即迁移!
> 要了解有关这些更改的更多信息,请参阅[此 GitHub 问题](https://github.com/dart-lang/sdk/issues/49530)。

215
Flutter-330.md Normal file
View File

@ -0,0 +1,215 @@
> 原文链接: https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff
**Flutter 3.3 正式发布啦,本次更新带来了 Flutter Web、桌面、文本性能处理等相关更新另外本次还为 `go_router` 、DevTools 和 VS Code 扩展引入了更多更新**。
# Framework
## Global Selection
Flutter Web 在之前的版本中,经常会有选择文本时与预期的行为不匹配的情况,因为与 Flutter App 一样,原生 Web 是由 elements 树组成。
在传统的 Web 应用中,开发者可以通过一个拖动手势选择多个 Web 元素,但这在 Flutter Web 上无法轻松完成。
**但是从 3.3 开始,随着`SelectableArea` 的引入, `SelectableArea` Widget 的任何 Child 都可以自由启用改能力**。
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image1)
要利用这个强大的新特性,只需使用 `SelectionArea` 嵌套你的页面,比如路由下的 `Scaffold`,然后让 Flutter 就会完成剩下的工作。
> 要更全面地深入了解这个新功能,请访问 `SelectableArea` [API](https://api.flutter.dev/flutter/material/SelectionArea-class.html)
## 触控板输入
**Flutter 3.3 改进了对触控板输入的支持**,这不仅提供了更丰富和更流畅的控制逻辑,还减少了某些情况下的错误识别。
举个例子,在[ Flutter cookbook ](https://docs.flutter.dev/cookbook) 中[拖动 UI 元素](https://docs.flutter.dev/cookbook/effects/drag-a-widget)页面,滚动到页面底部,然后执行以下步骤:
- 1. 缩小窗口大小,使上部呈现滚动条
- 2. 悬停在上部
- 3. 使用触控板滚动
- 4. 在 Flutter 3.3 之前,在触控板上滚动会拖动项目,因为 Flutter 正在调度模拟的一般事件
- 5. Flutter 3.3 后,在触控板上滚动会正确滚动列表,因为 Flutter 提供的是“滚动”手势,卡片无法识别,但滚动可以被识别。
有关更多信息,请参阅 [Flutter 触控板手势](https://docs.google.com/document/d/1oRvebwjpsC3KlxN1gOYnEdxtNpQDYpPtUFAkmTUe-K8/edit?resourcekey=0-pt4_T7uggSTrsq2gWeGsYQ) 设计文档,以及 GitHub 上的以下 PR
- PR 89944[在框架中支持触控板手势](https://github.com/flutter/flutter/pull/89944)
- PR 31591[iPad 触控板手势](https://github.com/flutter/engine/pull/31591)
- PR 34060[“ChromeOS/Android 触控板手势”](https://github.com/flutter/engine/pull/34060)
- PR 31594[Win32 触控板手势](https://github.com/flutter/engine/pull/31594)
- PR 31592[Linux 触控板手势](https://github.com/flutter/engine/pull/31592)
- PR 31593[Mac 触控板手势macOS](https://github.com/flutter/engine/pull/31593)
## Scribble
感谢社区成员[fbcouch](https://github.com/fbcouch)的贡献Flutter 现在支持在 iPadOS 上使用 Apple Pencil 进行 [Scribble](https://support.apple.com/guide/ipad/enter-text-with-scribble-ipad355ab2a7/ipados) 手写输入。
**默认情况下,此功能在 `CupertinoTextField`、`TextField` 和 `EditableText` 上启用,启用此功能,只需升级到 Flutter 3.3**。
![0_SlsnQUfdOTijdsyF.gif](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image2)
## Text input
为了改进对富文本编辑的支持,该版本引入了平台的 ` TextInputPlugin`**以前,`TextInputClient` 只交付新的编辑状态,没有新旧之间的差异信息,而 `TextEditingDeltas` 填补了 `DeltaTextInputClient` 这个信息空白**。
通过访问这些增量,开发者可以构建一个带有样式范围的输入字段,该范围在用户键入时会扩展和收缩。
> 要了解更多信息,请查看[富文本编辑器演示](https://flutter.github.io/samples/rich_text_editor.html)。
# Material Design 3
Flutter 团队继续将更多 Material Design 3 组件迁移到 Flutter。此版本包括对`IconButton`、`Chips`以及`AppBar`.
要监控 Material Design 3 迁移的进度请查看GitHub 上的[将 Material 3 带到 Flutter](https://github.com/flutter/flutter/issues/91605)。
## 图标按钮
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image3)
## Chip
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image4)
## Medium and large AppBar
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image5)
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image6)
# Desktop
## Windows
以前Windows 的版本由特定于 Windows 应用的文件设置,但这个行为与其他平台设置其版本的方式不一致。
**但现在开发者可以在项目 `pubspec.yaml` 文件和构建参数中设置 Windows 桌面应用程序版本**。
> 有关设置应用程序版本的更多信息,请遵循 [docs.flutter.dev](https://docs.flutter.dev/deployment/windows#updating-the-apps-version-number)上的文档和 [迁移指南](https://docs.flutter.dev/development/platform-integration/windows/version-migration)
# Packages
## go_router
为了扩展 Flutter 的原生导航 API团队发布了一个新版本的 `go_router` 包,它的设计使得移动端、桌面端和 Web 端的路由逻辑变得更加简单。
**`go router`包由 Flutter 团队维护,通过提供声明性的、基于 url 的 API 来简化路由**,从而更容易导航和处理深层链接。
> 最新版本 (5.0) 下应用能够使用异步代码进行重定向,并包括[迁移指南](https://docs.google.com/document/d/10l22o4ml4Ss83UyzqUC8_xYOv_QjZEi80lJDNE4q7wM/edit?usp=sharing&resourcekey=0-U-BXBQzNfkk4v241Ow-vZg)中描述的其他重大更改.有关更多信息,请查看 docs.flutter.dev 上的[导航和路由](https://docs.flutter.dev/development/ui/navigation)页面。
# VS Code 扩展增强
Flutter 的 Visual Studio Code 扩展有几个更新,包括添加依赖项的改进,**开发者现在可以使用Dart: Add Dependency**一步添加多个以逗号分隔的依赖项。
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image7)
# Flutter 开发者工具更新
自上一个稳定的 Flutter 版本以来DevTools 进行了许多更新,包括对数据显示表的 UX 和性能改进,以便更快、更少地滚动大型事件列表 ( [#4175](https://github.com/flutter/devtools/pull/4175) )。
有关 Flutter 3.0 以来更新的完整列表,请在此处查看各个公告:
- [Flutter DevTools 2.16.0 发布说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.16.0)
- [Flutter DevTools 2.15.0 发行说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.15.0)
- [Flutter DevTools 2.14.0 发布说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.14.0)
# Performance
## 光栅缓存改进
**此版本通过消除拷贝和减少 Dart 垃圾收集 (GC) 压力来提高从资产加载图像的性能**。
以前在加载资产图像时,`ImageProvider` API 需要多次复制压缩数据,当打开 assets 并将其作为类型化数据数组公开给 Dart 时,它会被复制到 native 堆中,然后当该类型化数据数组会被它被第二次复制到内部 `ui.ImmutableBuffer`
通过 [#32999](https://github.com/flutter/engine/pull/32999),压缩的图像字节可以直接加载到`ui.ImmutableBuffer.fromAsset`用于解码的结构中,这种方法 [需要](https://github.com/flutter/flutter/pull/103496) 更改`ImageProviders`,这个过程也更快,因为它绕过了先前方法基于通道的加载器所需的一些额外的调度开销,**特别是在我们的微基准测试中,图像加载时间提高了近 2 倍**。
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image8)
> 有关更多信息和迁移指南,请参阅在 docs.flutter.dev 上[ImageProvider.loadBuffer 。](https://docs.flutter.dev/release/breaking-changes/image-provider-load-buffer)
# Stability
## iOS 指针压缩已禁用
在 2.10 稳定版本中,我们在 iOS 上启用了 Dart 的[指针压缩优化](https://medium.com/dartlang/dart-2-15-7e7a598e508a#0c15),然而 GitHub 上的[Yeatse](https://github.com/Yeatse)[提醒我们](https://github.com/flutter/flutter/issues/105183) 优化的结果并不好。
Dart 的指针压缩通过为 Dart 的堆保留一个大的虚拟内存区域来工作,由于 iOS 上允许的总虚拟内存分配少于其他平台,因此这一大预留量减少了可供其他保留自己内存的组件使用的内存量,例如 Flutter 插件。
**虽然禁用指针压缩会增加 Dart 对象消耗的内存,但它也增加了 Flutter 应用程序的非 Dart 部分的可用内存,这总体上更可取的方向**。
Apple 提供了一项可以增加应用程序允许的最大虚拟内存分配的权利,但是此权利仅在较新的 iOS 版本上受支持,目前这并且不适用于运行 Flutter 仍支持的 iOS 版本的设备。
# API 改进
## PlatformDispatcher.onError
在以前的版本中,开发者必须手动配置自定义 `Zone` 项才能捕获应用程序的所有异常和错误,但是自定义 `Zone` 对 Dart 核心库中的一些优化是有害的,这会减慢应用程序的启动时间。
**在此版本中,开发者可以通过设置回调来捕获所有错误和异常,而不是使用自定义。**
> 有关更多信息请查看docs.flutter.dev 上 Flutter 页面中更新的 [PlatformDispatcher.onError](https://docs.flutter.dev/testing/errors)
## FragmentProgram changes
用 GLSL 编写并在 `shaders:` 应用文件的 Flutter 清单中列出的片段着色器,`pubspec.yaml` 现在将自动编译为引擎可以理解的正确格式,并作为 assets 与应用捆绑在一起。
通过此次更改,开发者将不再需要使用第三方工具手动编译着色器,未来应该是将 Engine 的`FragmentProgram` API 视为仅接受 Flutter 构建工具的输出,当然目前还没有这种情况,但计划在未来的版本中进行此更改,如 [FragmentProgram API 支持改进](http://flutter.dev/go/fragment-program-support)设计文档中所述。
> 有关此更改的示例,请参阅此[Flutter 着色器示例](https://github.com/zanderso/fragment_shader_example)。
## Fractional translation
以前Flutter Engine 总是将 composited layers 与精确的像素边界对齐因为它提高了旧款32 位iPhone 的渲染性能。
自从添加桌面支持以来,我们注意到这导致了可观察到的捕捉行为,因为屏幕设备像素比通常要低得多,例如,在低 DPR 屏幕上,可以看到工具提示在淡入时明显捕捉。
在确定这种像素捕捉对于新 iPhone 型号的性能不再必要后,[#103909](https://github.com/flutter/flutter/issues/103909) 从 Flutter 引擎中删除了这种像素捕捉以提高桌面保真度。
此外,我们还发现,去除这种像素捕捉可以稳定我们的一些黄金图像测试,这些测试会经常随着细微的细线渲染差异而改变。
# 对支持平台的更改
## 32 位 iOS 弃用
正如我们之前在3.0 版本里宣布的一样 ,由于使用量减少,该版本是[最后一个支持 32 位 iOS 设备和 iOS 版本 9 和 10](http://flutter.dev/go/rfc-32-bit-ios-unsupported)的版本。
此更改影响 iPhone 4S、iPhone 5、iPhone 5C 以及第 2、3d 和第 4 代 iPad 设备。
Flutter 3.3 稳定版本和所有后续稳定版本不再支持 32 位 iOS 设备以及 iOS 9 和 10 版本,这意味着基于 Flutter 3.3 及更高版本构建的应用程序将无法在这些设备上运行。
## 停用 macOS 10.11 和 10.12
在 2022 年第四季度稳定版本中,我们预计将放弃对 macOS 版本 10.11 和 10.12 的支持。
这意味着在那之后针对稳定的 Flutter SDK 构建的应用程序将不再在这些版本上运行,并且 Flutter 支持的最低 macOS 版本将增加到 10.13 High Sierra。
## Bitcode deprecation
[在即将发布的 Xcode 14 版本中iOS 应用程序提交将不再接受](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes) Bitcode ,并且启用了 bitcode 的项目将在此版本的 Xcode 中发出构建警告。鉴于此Flutter 将在未来的稳定版本中放弃对位码的支持。
默认情况下Flutter 应用程序没有启用 Bitcode我们预计这不会影响许多开发人员。
但是,如果你在 Xcode 项目中手动启用了 bitcode请在升级到 Xcode 14 后立即禁用它,可以通过打开 `ios/Runner.xcworkspace` 构建设置**Enable Bitcode**并将其设置为**No**来做到这一点Add-to-app 开发者应该在宿主 Xcode 项目中禁用它。
![](http://img.cdn.guoshuyu.cn/20220831_Flutter-330/image9)

215
Flutter-330.md.bak Normal file
View File

@ -0,0 +1,215 @@
> 原文链接: https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff
**Flutter 3.3 正式发布啦,本次更新带来了 Flutter Web、桌面、文本性能处理等相关更新另外本次还为 `go_router` 、DevTools 和 VS Code 扩展引入了更多更新**。
# Framework
## Global Selection
Flutter Web 在之前的版本中,经常会有选择文本时与预期的行为不匹配的情况,因为与 Flutter App 一样,原生 Web 是由 elements 树组成。
在传统的 Web 应用中,开发者可以通过一个拖动手势选择多个 Web 元素,但这在 Flutter Web 上无法轻松完成。
**但是从 3.3 开始,随着`SelectableArea` 的引入, `SelectableArea` Widget 的任何 Child 都可以自由启用改能力**。
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/57f5252fa6b14a18b2aa9ffaa9849889~tplv-k3u1fbpfcp-watermark.image?)
要利用这个强大的新特性,只需使用 `SelectionArea` 嵌套你的页面,比如路由下的 `Scaffold`,然后让 Flutter 就会完成剩下的工作。
> 要更全面地深入了解这个新功能,请访问 `SelectableArea` [API](https://api.flutter.dev/flutter/material/SelectionArea-class.html)
## 触控板输入
**Flutter 3.3 改进了对触控板输入的支持**,这不仅提供了更丰富和更流畅的控制逻辑,还减少了某些情况下的错误识别。
举个例子,在[ Flutter cookbook ](https://docs.flutter.dev/cookbook) 中[拖动 UI 元素](https://docs.flutter.dev/cookbook/effects/drag-a-widget)页面,滚动到页面底部,然后执行以下步骤:
- 1. 缩小窗口大小,使上部呈现滚动条
- 2. 悬停在上部
- 3. 使用触控板滚动
- 4. 在 Flutter 3.3 之前,在触控板上滚动会拖动项目,因为 Flutter 正在调度模拟的一般事件
- 5. Flutter 3.3 后,在触控板上滚动会正确滚动列表,因为 Flutter 提供的是“滚动”手势,卡片无法识别,但滚动可以被识别。
有关更多信息,请参阅 [Flutter 触控板手势](https://docs.google.com/document/d/1oRvebwjpsC3KlxN1gOYnEdxtNpQDYpPtUFAkmTUe-K8/edit?resourcekey=0-pt4_T7uggSTrsq2gWeGsYQ) 设计文档,以及 GitHub 上的以下 PR
- PR 89944[在框架中支持触控板手势](https://github.com/flutter/flutter/pull/89944)
- PR 31591[iPad 触控板手势](https://github.com/flutter/engine/pull/31591)
- PR 34060[“ChromeOS/Android 触控板手势”](https://github.com/flutter/engine/pull/34060)
- PR 31594[Win32 触控板手势](https://github.com/flutter/engine/pull/31594)
- PR 31592[Linux 触控板手势](https://github.com/flutter/engine/pull/31592)
- PR 31593[Mac 触控板手势macOS](https://github.com/flutter/engine/pull/31593)
## Scribble
感谢社区成员[fbcouch](https://github.com/fbcouch)的贡献Flutter 现在支持在 iPadOS 上使用 Apple Pencil 进行 [Scribble](https://support.apple.com/guide/ipad/enter-text-with-scribble-ipad355ab2a7/ipados) 手写输入。
**默认情况下,此功能在 `CupertinoTextField`、`TextField` 和 `EditableText` 上启用,启用此功能,只需升级到 Flutter 3.3**。
![0_SlsnQUfdOTijdsyF.gif](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7f945f93d21c414ab3fd1dedd7f1a2f3~tplv-k3u1fbpfcp-watermark.image?)
## Text input
为了改进对富文本编辑的支持,该版本引入了平台的 ` TextInputPlugin`**以前,`TextInputClient` 只交付新的编辑状态,没有新旧之间的差异信息,而 `TextEditingDeltas` 填补了 `DeltaTextInputClient` 这个信息空白**。
通过访问这些增量,开发者可以构建一个带有样式范围的输入字段,该范围在用户键入时会扩展和收缩。
> 要了解更多信息,请查看[富文本编辑器演示](https://flutter.github.io/samples/rich_text_editor.html)。
# Material Design 3
Flutter 团队继续将更多 Material Design 3 组件迁移到 Flutter。此版本包括对`IconButton`、`Chips`以及`AppBar`.
要监控 Material Design 3 迁移的进度请查看GitHub 上的[将 Material 3 带到 Flutter](https://github.com/flutter/flutter/issues/91605)。
## 图标按钮
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4cb96d60d0534254b29a7b2eb66419a4~tplv-k3u1fbpfcp-watermark.image?)
## Chip
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6b385a3d3e214a4181071ee6b0d07eb0~tplv-k3u1fbpfcp-watermark.image?)
## Medium and large AppBar
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/51504518e30b4de1b66e2b2222fc9b1b~tplv-k3u1fbpfcp-watermark.image?)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ecffcefdb0ac4772b935e4302ca3525b~tplv-k3u1fbpfcp-watermark.image?)
# Desktop
## Windows
以前Windows 的版本由特定于 Windows 应用的文件设置,但这个行为与其他平台设置其版本的方式不一致。
**但现在开发者可以在项目 `pubspec.yaml` 文件和构建参数中设置 Windows 桌面应用程序版本**。
> 有关设置应用程序版本的更多信息,请遵循 [docs.flutter.dev](https://docs.flutter.dev/deployment/windows#updating-the-apps-version-number)上的文档和 [迁移指南](https://docs.flutter.dev/development/platform-integration/windows/version-migration)
# Packages
## go_router
为了扩展 Flutter 的原生导航 API团队发布了一个新版本的 `go_router` 包,它的设计使得移动端、桌面端和 Web 端的路由逻辑变得更加简单。
**`go router`包由 Flutter 团队维护,通过提供声明性的、基于 url 的 API 来简化路由**,从而更容易导航和处理深层链接。
> 最新版本 (5.0) 下应用能够使用异步代码进行重定向,并包括[迁移指南](https://docs.google.com/document/d/10l22o4ml4Ss83UyzqUC8_xYOv_QjZEi80lJDNE4q7wM/edit?usp=sharing&resourcekey=0-U-BXBQzNfkk4v241Ow-vZg)中描述的其他重大更改.有关更多信息,请查看 docs.flutter.dev 上的[导航和路由](https://docs.flutter.dev/development/ui/navigation)页面。
# VS Code 扩展增强
Flutter 的 Visual Studio Code 扩展有几个更新,包括添加依赖项的改进,**开发者现在可以使用Dart: Add Dependency**一步添加多个以逗号分隔的依赖项。
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5957872a2f114262b66a099b6bae7cdf~tplv-k3u1fbpfcp-watermark.image?)
# Flutter 开发者工具更新
自上一个稳定的 Flutter 版本以来DevTools 进行了许多更新,包括对数据显示表的 UX 和性能改进,以便更快、更少地滚动大型事件列表 ( [#4175](https://github.com/flutter/devtools/pull/4175) )。
有关 Flutter 3.0 以来更新的完整列表,请在此处查看各个公告:
- [Flutter DevTools 2.16.0 发布说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.16.0)
- [Flutter DevTools 2.15.0 发行说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.15.0)
- [Flutter DevTools 2.14.0 发布说明](https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.14.0)
# Performance
## 光栅缓存改进
**此版本通过消除拷贝和减少 Dart 垃圾收集 (GC) 压力来提高从资产加载图像的性能**。
以前在加载资产图像时,`ImageProvider` API 需要多次复制压缩数据,当打开 assets 并将其作为类型化数据数组公开给 Dart 时,它会被复制到 native 堆中,然后当该类型化数据数组会被它被第二次复制到内部 `ui.ImmutableBuffer`
通过 [#32999](https://github.com/flutter/engine/pull/32999),压缩的图像字节可以直接加载到`ui.ImmutableBuffer.fromAsset`用于解码的结构中,这种方法 [需要](https://github.com/flutter/flutter/pull/103496) 更改`ImageProviders`,这个过程也更快,因为它绕过了先前方法基于通道的加载器所需的一些额外的调度开销,**特别是在我们的微基准测试中,图像加载时间提高了近 2 倍**。
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c447c57cf4b14809a78fd1117044100a~tplv-k3u1fbpfcp-watermark.image?)
> 有关更多信息和迁移指南,请参阅在 docs.flutter.dev 上[ImageProvider.loadBuffer 。](https://docs.flutter.dev/release/breaking-changes/image-provider-load-buffer)
# Stability
## iOS 指针压缩已禁用
在 2.10 稳定版本中,我们在 iOS 上启用了 Dart 的[指针压缩优化](https://medium.com/dartlang/dart-2-15-7e7a598e508a#0c15),然而 GitHub 上的[Yeatse](https://github.com/Yeatse)[提醒我们](https://github.com/flutter/flutter/issues/105183) 优化的结果并不好。
Dart 的指针压缩通过为 Dart 的堆保留一个大的虚拟内存区域来工作,由于 iOS 上允许的总虚拟内存分配少于其他平台,因此这一大预留量减少了可供其他保留自己内存的组件使用的内存量,例如 Flutter 插件。
**虽然禁用指针压缩会增加 Dart 对象消耗的内存,但它也增加了 Flutter 应用程序的非 Dart 部分的可用内存,这总体上更可取的方向**。
Apple 提供了一项可以增加应用程序允许的最大虚拟内存分配的权利,但是此权利仅在较新的 iOS 版本上受支持,目前这并且不适用于运行 Flutter 仍支持的 iOS 版本的设备。
# API 改进
## PlatformDispatcher.onError
在以前的版本中,开发者必须手动配置自定义 `Zone` 项才能捕获应用程序的所有异常和错误,但是自定义 `Zone` 对 Dart 核心库中的一些优化是有害的,这会减慢应用程序的启动时间。
**在此版本中,开发者可以通过设置回调来捕获所有错误和异常,而不是使用自定义。**
> 有关更多信息请查看docs.flutter.dev 上 Flutter 页面中更新的 [PlatformDispatcher.onError](https://docs.flutter.dev/testing/errors)
## FragmentProgram changes
用 GLSL 编写并在 `shaders:` 应用文件的 Flutter 清单中列出的片段着色器,`pubspec.yaml` 现在将自动编译为引擎可以理解的正确格式,并作为 assets 与应用捆绑在一起。
通过此次更改,开发者将不再需要使用第三方工具手动编译着色器,未来应该是将 Engine 的`FragmentProgram` API 视为仅接受 Flutter 构建工具的输出,当然目前还没有这种情况,但计划在未来的版本中进行此更改,如 [FragmentProgram API 支持改进](http://flutter.dev/go/fragment-program-support)设计文档中所述。
> 有关此更改的示例,请参阅此[Flutter 着色器示例](https://github.com/zanderso/fragment_shader_example)。
## Fractional translation
以前Flutter Engine 总是将 composited layers 与精确的像素边界对齐因为它提高了旧款32 位iPhone 的渲染性能。
自从添加桌面支持以来,我们注意到这导致了可观察到的捕捉行为,因为屏幕设备像素比通常要低得多,例如,在低 DPR 屏幕上,可以看到工具提示在淡入时明显捕捉。
在确定这种像素捕捉对于新 iPhone 型号的性能不再必要后,[#103909](https://github.com/flutter/flutter/issues/103909) 从 Flutter 引擎中删除了这种像素捕捉以提高桌面保真度。
此外,我们还发现,去除这种像素捕捉可以稳定我们的一些黄金图像测试,这些测试会经常随着细微的细线渲染差异而改变。
# 对支持平台的更改
## 32 位 iOS 弃用
正如我们之前在3.0 版本里宣布的一样 ,由于使用量减少,该版本是[最后一个支持 32 位 iOS 设备和 iOS 版本 9 和 10](http://flutter.dev/go/rfc-32-bit-ios-unsupported)的版本。
此更改影响 iPhone 4S、iPhone 5、iPhone 5C 以及第 2、3d 和第 4 代 iPad 设备。
Flutter 3.3 稳定版本和所有后续稳定版本不再支持 32 位 iOS 设备以及 iOS 9 和 10 版本,这意味着基于 Flutter 3.3 及更高版本构建的应用程序将无法在这些设备上运行。
## 停用 macOS 10.11 和 10.12
在 2022 年第四季度稳定版本中,我们预计将放弃对 macOS 版本 10.11 和 10.12 的支持。
这意味着在那之后针对稳定的 Flutter SDK 构建的应用程序将不再在这些版本上运行,并且 Flutter 支持的最低 macOS 版本将增加到 10.13 High Sierra。
## Bitcode deprecation
[在即将发布的 Xcode 14 版本中iOS 应用程序提交将不再接受](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes) Bitcode ,并且启用了 bitcode 的项目将在此版本的 Xcode 中发出构建警告。鉴于此Flutter 将在未来的稳定版本中放弃对位码的支持。
默认情况下Flutter 应用程序没有启用 Bitcode我们预计这不会影响许多开发人员。
但是,如果你在 Xcode 项目中手动启用了 bitcode请在升级到 Xcode 14 后立即禁用它,可以通过打开 `ios/Runner.xcworkspace` 构建设置**Enable Bitcode**并将其设置为**No**来做到这一点Add-to-app 开发者应该在宿主 Xcode 项目中禁用它。
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/12d3be467b014be6841dd22f4b6fa71a~tplv-k3u1fbpfcp-watermark.image?)

View File

@ -91,12 +91,14 @@
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
- [Flutter 2.10 release 发布,快来看看新特性吧](Flutter-2100.md)
- [Flutter 3.0 发布啦~快来看看有什么新功能-2022 Google I/O](Flutter-300.md)
- [Flutter 3.3 正式发布,快来看看有什么新功能吧](Flutter-330.md)
- **Dart**
- [Dart 2.12 发布稳定空安全声明和FFI版本Dart 未来的计划](Dart-212.md)
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)
- [Dart 2.16 发布的新特性](Dart-216.md)
- [Dart 2.17 发布的新特性](Dart-217.md)
- [Dart 2.18 发布Objective-C 和 Swift interop](Dart-218.md)
* [番外](FWREADME.md)

View File

@ -58,12 +58,14 @@
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
- [Flutter 2.10 release 发布,快来看看新特性吧](Flutter-2100.md)
- [Flutter 3.0 发布啦~快来看看有什么新功能-2022 Google I/O](Flutter-300.md)
- [Flutter 3.3 正式发布,快来看看有什么新功能吧](Flutter-330.md)
- **Dart**
- [Dart 2.12 发布稳定空安全声明和FFI版本Dart 未来的计划](Dart-212.md)
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)
- [Dart 2.16 发布的新特性](Dart-216.md)
- [Dart 2.17 发布的新特性](Dart-217.md)
- [Dart 2.18 发布Objective-C 和 Swift interop](Dart-218.md)
* [番外](FWREADME.md)

View File

@ -11,6 +11,7 @@
- [Flutter 2.8 release 发布,快来看看新特性吧](Flutter-280.md)
- [Flutter 2.10 release 发布,快来看看新特性吧](Flutter-2100.md)
- [Flutter 3.0 发布啦~快来看看有什么新功能-2022 Google I/O](Flutter-300.md)
- [Flutter 3.3 正式发布,快来看看有什么新功能吧](Flutter-330.md)
@ -22,5 +23,6 @@
- [Dart 2.14 发布,新增语言特性和共享标准 lint](Dart-214.md)
- [Dart 2.15 发布的新特性](Dart-215.md)
- [Dart 2.16 发布的新特性](Dart-216.md)
- [Dart 2.16 发布的新特性](Dart-217.md)
- [Dart 2.17 发布的新特性](Dart-217.md)
- [Dart 2.18 发布Objective-C 和 Swift interop](Dart-218.md)