diff --git a/src/_includes/banner.html b/src/_includes/banner.html index ca561824a1..8bc7a77447 100644 --- a/src/_includes/banner.html +++ b/src/_includes/banner.html @@ -2,7 +2,7 @@ For headings use h3 elements. {% endcomment -%} diff --git a/src/content/posts/dart-3-5.md b/src/content/posts/dart-3-5.md new file mode 100644 index 0000000000..aa3b5b722d --- /dev/null +++ b/src/content/posts/dart-3-5.md @@ -0,0 +1,89 @@ +--- +title: Dart 3.5 更新详解 +toc: true +--- + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/e3c67fec6c3b5.gif) + +又到了我们季度发布 Dart SDK 的时候了。这次我们在互操作性方面做了改进,为 pub.dev package 管理器添加了新功能,并且将我们新的 Web 集成 API 升级为稳定版和 1.0 版。 + +我们投入了大量精力在一些需要多个季度才能完成的大型工作上。因此,我们也更新了 Dart 的路线图,详细介绍了我们希望在未来几个季度取得进展的内容。 + +## Dart 3.5 中的新功能 + +Dart 3.5 包含了一些新功能,下面会详细介绍。同时还对核心库 API 做了一些小的改动,以及约 10 个非常小的破坏性变更,具体可以查看[更新日志](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#350)。 + +## Web 平台和 JS 互操作性 + +在 Dart 3.4 和 Flutter 3.22 中,我们引入了[将 Flutter Web 应用编译为 WebAssembly](https://docs.flutter.cn/platform-integration/web/wasm) 的支持。编译为 WebAssembly 需要使用我们新的 [Dart 到 JS 互操作模型](https://dart.cn/interop/js-interop),该模型之前还处于预览阶段。从 Dart 3.5 开始,它现在被认为是稳定和完整的,我们还将 [package:web](https://pub.flutter-io.cn/packages/web) 中的浏览器 API 绑定(它取代了旧的 `dart:html` 库)更新到了 1.0 版本。 + +我们鼓励所有 Web package 的作者[迁移到 package:web](https://dart.cn/interop/js-interop/package-web)。我们计划在下一个 Dart 版本中弃用旧的互操作 API (dart:html、dart:js、package:js 等),并在明年晚些时候完全停止支持它们。我们邀请你在[跟踪 issue](https://github.com/dart-lang/sdk/issues/56358)中对这个计划提供反馈。我们还计划更新 pub.dev package 管理器的[评分系统](https://pub.flutter-io.cn/help/scoring),为支持新互操作模型的 Web package 加分。 + +我们还添加了[一个新的 lint 规则](https://dart.cn/tools/linter-rules/invalid_runtime_check_with_js_interop_types)(代码风格检查规则),用于验证你的代码是否正确使用了新的 JS 互操作类型。我们建议你在迁移 Web package 时将这个 lint 规则添加到 `analysis_options.yaml` 文件中。 + +## Dart 原生互操作性 + +我们还对原生互操作性做了一系列改进,支持直接从 Dart 调用 C、Java、Kotlin、Objective-C 和 Swift。 + +C 互操作是通过我们的 [FFI](https://dart.cn/interop/c-interop) (外部函数接口)库实现的,我们已经支持了几年。在 Dart 3.5 中,我们做了一些增量改进,支持直接将 Dart `TypedData` 对象的指针传递给 FFI,避免了先将内存从 Dart 复制到原生代码的需要([详情](https://github.com/dart-lang/sdk/issues/44589))。 + +Java 和 Kotlin 互操作是通过 [JNIgen](https://pub.flutter-io.cn/packages/jnigen) 生成器(目前处于预览阶段)实现的,它可以自动创建通过 Java 原生接口(JNI,Java Native Interface)从 Dart 调用 Java 和 Kotlin 的绑定代码。我们改进了性能,并添加了对 Java 异常和 Kotlin 顶级函数的支持。我们还停止了对之前的[基于 C 的绑定](https://github.com/dart-lang/native/issues/660)的支持,因为替代的纯 Dart 绑定现在具有可比的性能和功能,而且使用起来更加简单。详情请参见[更新日志](https://pub.flutter-io.cn/packages/jnigen/changelog)。 + +Objective-C 互操作建立在 FFI 和我们的 [FFIgen](https://pub.flutter-io.cn/packages/ffigen) 生成器(目前处于预览阶段)之上。我们添加了对 Objective-C 协议和常见类型(如 `NSString`)的支持。有关使用 FFIgen 构建的大型 package 的示例,请参见 [cupertino_http](https://github.com/dart-lang/http/tree/master/pkgs/cupertino_http),它与 Apple 的 URL 加载系统网络库进行互操作。 + +在接下来的版本中,我们将继续投资进一步的互操作性——既包括完善上述提到的库,也包括支持 Swift。详情请参见下面的路线图部分。 + +## Pub.dev package 仓库 + +Pub.dev 是我们的 package 仓库,社区可以在这里分享和查找具有丰富功能的 package。我们在这方面做了一些改进。首先,我们改进了对[**主题**](https://dart.cn/tools/pub/pubspec#topics)的支持:package 作者可以通过这种机制为他们的 package 添加所属类别的标签(例如 widget)。我们现在[整合](https://github.com/dart-lang/pub-dev/blob/master/doc/topics.yaml)了涵盖同一类别但措辞略有不同的常见主题(例如 widgets 与 widget)。 + +其次,我们添加了一个新的 `pub unpack` 命令。这提供了一种快速简便的方法来将 package 下载到你的文件系统中。例如,如果你想在本地机器上运行 package 的示例程序,可以使用这个命令: + +```shell +$ dart pub unpack path +Downloading path 1.9.0 to `./path-1.9.0`... + +$ cd path-1.9.0/example/ + +$ dart run example.dart +Current path style: posix +Current process path: /Users/mit/tmp/path-1.9.0/example +``` + +第三,我们添加了一个新的 `pub downgrade --tighten` 命令。这可以用来检查 package 的依赖项中的所有版本约束。运行时,它会将下限约束更新为 pub 能够解析的最低版本。 + +## Dart 路线图更新 + +除了上面完成的功能外,我们还在许多领域开展工作,以推进我们的长期路线图。 + +## 大型单一代码库的 IDE 和分析器性能 + +"单一代码库"(monorepo)是一种常见的方式,用于将一组相关 package 和应用的源代码结构化到单个代码库中,例如 Flutter 的 [packages repo](https://github.com/flutter/packages/tree/main)。单一代码库不仅仅是为了方便将所有源代码"放在一起",还可以是确保代码库中的各个 package 和应用相互兼容的关键工具。 + +我们一直听到在大型单一代码库中工作的开发者反馈,我们的工具,特别是分析器的性能可能不太理想。我们对这些问题的分析表明,根本原因是我们最终为每个 package 及其所有依赖项加载了多个重叠的分析上下文,导致单一代码库中每个 package 的分析在内存中同时存在多个副本。我们认为根本的解决方案是为这样的代码库中每个依赖项的版本创建一个单一的、共享的解析,我们正在通过一个名为 workspaces 的新 pub 功能来实现这种能力。我们将在下一个 Dart 版本中分享更多相关内容,但现在你可以看看这是如何[最近应用](https://github.com/flutter/engine/pull/54157/files)到 Flutter 引擎代码库的。 + +## Pub.dev package 仓库 + +pub.dev package 仓库的用户长期以来一直要求改进对每个 package 的[使用/下载](https://github.com/dart-lang/pub-dev/issues/2714)情况的度量。这对 package 作者来说可能很有帮助,作为他们的工作为多少用户带来好处的信号,对 package 消费者来说也是其他开发者正在使用哪些 package 的信号。我们很高兴地分享,我们在这个功能上取得了很好的进展,希望在年底前提供预览版。 + +## Dart 原生互操作 + +对于使用 JNIgen 的 Java 和 Kotlin 互操作,我们预计在接下来的两个季度内完成核心支持,并从实验阶段升级到稳定的 1.0 版本。详情请参见 [JNIgen 跟踪器](https://github.com/orgs/dart-lang/projects/69/)。对于 Objective-C 互操作,我们有类似的目标;请参见 [Objective-C 跟踪器](https://github.com/orgs/dart-lang/projects/87)。 + +接下来我们正在研究与 Swift 代码的直接互操作。初步实验看起来很有希望,我们希望在明年初添加实验性支持。 + +## 原生互操作和原生源代码的打包 + +在许多情况下,直接互操作用于调用操作系统中存在的 API,这意味着这些 API 在那些宿主平台上始终可用。然而,在某些情况下,Dart 互操作的代码是不直接包含在宿主上的原生源代码,这给使用这种互操作的 package 作者带来了一个实际挑战:如何在不将大量手动步骤推给 package 的消费者的情况下,打包和构建那些原生源代码?为了支持这一点,我们正在探索一个[原生资产系统](https://github.com/dart-lang/sdk/issues/50565),它可以支持发布包含原生源代码的 Dart package,同时提供一个标准化的协议,使 `dart` 和 `flutter` CLI 工具能够自动化构建和打包这些源代码。我们设想这将启用一组新的互操作用例,同时为使用依赖原生源代码的 package 的开发者提供简单的用户体验。 + +## Dart 语言和宏 + +Dart 语言和编译器团队目前的大部分时间都花在推进非常大的语言特性宏上,我们在 [Dart 3.4 博文](https://medium.com/dartlang/dart-3-4-bd8d23b4462a)中介绍过这个特性。正如我们当时所说,这是一项巨大的工作,有可能在热重载等一些核心用例中造成回归,所以我们采取了一种彻底的方法,可能还需要几个季度的进一步工作才能分享下一步的细节。 + +除了宏之外,我们还同时在探索一些其他较小的语言特性,如 [Dart 语言漏斗](https://github.com/orgs/dart-lang/projects/90/views/1)中所记录的。 + +从去年秋天开始,我们一直在重写 Dart 格式化程序。旧的设计运行良好多年,但随着 Flutter 的成功,我们希望转向[一种新的风格](https://github.com/dart-lang/dart_style/issues/1253),更适合 Flutter 用户经常编写的那种声明式代码。旧的格式化程序无法产生那种输出。重写工作即将完成,很快就会发布。如果你想试用,可以传递实验标志 `tall-style` ([标志说明](https://dart.cn/tools/experiment-flags))。如果你看到奇怪的输出,欢迎[提供反馈](https://github.com/dart-lang/dart_style/issues)。 + +## 结语 + +今天的内容就到这里。我们欢迎你对讨论的路线图项目以及 Dart 3.5 中的新功能提供反馈。Dart 3.5 可以从 [dart.cn](https://dart.cn/get-dart) 获得,也包含在今天发布的 [Flutter 3.24 版本](/posts/whats-new-in-flutter-3-24)中。 \ No newline at end of file diff --git a/src/content/posts/flutter-3-24-dart-3-5.md b/src/content/posts/flutter-3-24-dart-3-5.md new file mode 100644 index 0000000000..da7c2d26c3 --- /dev/null +++ b/src/content/posts/flutter-3-24-dart-3-5.md @@ -0,0 +1,60 @@ +--- +title: Flutter 3.24 和 Dart 3.5 现已发布 +toc: true +--- + + +今天,我们正式发布 Flutter 3.24 和 Dart 3.5,与此同时,[I/O 2024 Connect 系列活动](https://ioconnectchina.googlecnapps.cn/) 的最后一站即将在几小时后在中国举行 —— 中国是 Flutter 全球最活跃的社区之一,这让本次发布更具意义。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/d93bd7d871bc3.gif) + +我们在 5 月的 [Google I/O](https://io.google/2024/) 上宣布了一系列令人兴奋的更新,包括 WebAssembly 编译支持进入稳定渠道、Impeller 的改进,以及对 Dart 宏的未来展望。 + +Flutter 3.24 和 Dart 3.5 版本进一步推进了我们的使命 —— 帮助你创建出色、高性能的应用,可以在移动端、Web 端和桌面端触及用户 —— 全部使用单一共享代码库。它们包括新的 Flutter GPU API 的早期预览、Web 上元素嵌入的增强,以及针对 iOS 生态系统构建的几项令人兴奋的更新,包括对 Swift Package Manager 的早期支持,以及对 Cupertino widget 的功能更新。 + +让我们一起来看看具体更新内容! + +## Impeller: 提高多平台图形性能的标准 + +传统上,跨平台框架在视觉效果上需要妥协,因为它们依赖于底层平台提供的高级抽象。Flutter 采用了不同的方法,拥有自己的渲染层,可以在每个设备上提供硬件加速的图形和流畅的性能。我们在 [Impeller](https://docs.flutter.cn/perf/impeller) 和 [着色器](https://docs.flutter.cn/ui/design/graphics/fragment-shaders) 方面取得了实质性进展,为图形处理带来了激动人心的新可能 —— 比如 3D。 + +我们很高兴分享新的 [Flutter GPU API](https://github.com/flutter/engine/blob/main/docs/impeller/Flutter-GPU.md) 的早期预览,这是一个强大的底层图形 API,直接集成到 Flutter SDK 中。你可以通过该 API 自定义光栅管线并直接向 GPU 提交绘制调用,使得创建专门的渲染器成为可能,如 2D Canvas 替代品、3D 场景图,甚至粒子系统,以创建视觉上令人惊叹、高性能和身临其境的体验,而无需通常需要的引擎级别的开销。 + +![在 flutter_scene 中渲染的科幻太空头盔的 3D 动画](https://img-s2.andfun.cn/devrel/posts/2024/08/980027fc41658.gif) + +考虑到这是一个底层 API,我们预计对于没有大量图形开发经验的开发者来说会有一个学习曲线。这就是为什么我们正在投资渲染 package,比如新的 `flutter_scene` package,它借助于 Flutter GPU API 导入动画 glTF 模型和构建 3D 场景,使你能够在 Flutter 和 Dart 中轻松构建 3D 应用和游戏,就像下面这个视频里展示的那样。 + +【插入视频】 + +虽然 Flutter GPU API 提供了令人兴奋的可能性,但它仍处于早期预览阶段,我们可能会对 API 进行重大更改。我们建议在使用 Flutter GPU 时针对 Flutter 的主分支进行开发。在博文 [Flutter GPU 和 Flutter Scene 简介](https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11) 中了解更多信息。 + +## “更 iOS 和 macOS” 的 Flutter —— 轻松地为 Apple 生态系统交付美观、快速的应用 + +我们的目标是让你能够构建出色的应用,这些应用感觉原生且性能出色。这项工作的一部分是优化性能以及最大化 Flutter 与底层平台的兼容性,包括访问 Apple 生态系统的全部功能。 + +在这个版本中,我们引入了对 Swift Package Manager 的早期支持,让开发者可以使用丰富的 Swift package 生态系统,并使 Flutter 插件能够利用大量预构建的功能来加速开发。一旦 Swift Package Manager (SPM) 被插件开发者广泛采用,它应该能简化 Flutter 安装过程本身,并降低新手的入门门槛,特别是那些不熟悉 iOS 生态系统的人。我们鼓励插件作者 [尝试为你的插件添加 SPM 支持](https://docs.flutter.cn/packages-and-plugins/swift-package-manager/for-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin),并提供你的体验 [反馈](https://github.com/flutter/flutter/issues)。 + +接下来,我们希望让你始终能够对设计师说「没问题、能实现」,并在 iOS 上交付高保真体验。为了解决这个问题,我们着手对 Cupertino widget 库进行现代化改造和扩展,解决了 Cupertino 的 [15 个问题](https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aclosed+label%3A%22f%3A+cupertino%22+sort%3Aupdated-desc+closed%3A2024-04-01..2024-07-01+),并在 [widget 目录](https://docs.flutter.cn/ui/widgets/cupertino) 中添加了 37 个缺失的 Cupertino widget。 + +最后,我们为 Flutter macOS 应用添加了 [平台视图](https://docs.flutter.cn/platform-integration/macos/platform-views)和 [WebView](https://docs.flutter.cn/platform-integration/web/web-content-in-flutter) 支持,允许将原生 macOS UI 组件无缝集成到你的 Flutter 应用中,以获得更完整和精致的用户体验。 + +展望未来,我们将继续在 Cupertino widget 保真度、Swift Package Manager 支持以及与 Apple 平台的集成和互操作性方面投入更多资源,让开发变得更加简单高效。 + +## 突显全球活跃的 Flutter 社区的影响 + +我们要感谢社区的贡献,包括你的贡献,这些发布离不开你们的支持!这组发布包含了近 1,500 次提交,来自超过 167 位独特的贡献者,包括 49 位新的贡献者。我们对 Flutter 社区持续高水平的活跃度、承诺和增长感到鼓舞,包括那些积极构建框架的人。感谢你们! + +我们的共同努力正在世界各地产生影响,创造出令人惊叹的应用和体验,每天有数百万人在使用。例如,这里有一个 [案例研究](http://flutter.dev/showcase/xiaomi) 的预览,展示了中国科技公司小米的一个小团队如何以及为什么使用 Flutter 开发该公司流行的新电动汽车 [小米 SU7](https://www.mi.com/global/discover/article?id=3263&ref=renatomitra.com) 的配套应用。 + +全球还有几个令人兴奋的 Flutter 应用示例: + +- [**SNCF Connect**](http://flutter.dev/showcase/sncf-connect): 法国铁路,欧洲最大的 Flutter 应用,拥有超过 150 个屏幕,与奥运会合作,对 Flutter 应用进行了多项更新,使数百万访客能够在奥运会期间畅游法国。 +- [**Wolt**](http://flutter.dev/showcase/wolt): DoorDash International 旗下产品,使用 Flutter 扩展到商户零售市场。 +- [**惠而浦**](http://flutter.dev/showcase/whirlpool): 一家在全球拥有业务的财富 500 强公司,正在使用 Flutter 探索巴西的新销售渠道。 +- [**Monta**](http://flutter.dev/showcase/monta): 一家丹麦电动汽车充电生态系统初创公司,使用 Flutter 仅用 3 个月就将他们的第一个移动应用推向市场,后来又成功地将他们的 Web 应用移植到 Flutter。 + +## 总结 + +以上只是 Flutter 和 Dart 在这些版本中的部分新功能和更新,你可以在[《Flutter 3.24 更新详解》](/posts/whats-new-in-flutter-3-24) 文章和[《Dart 3.5 更新详解》](/posts/dart-3-5) 文章中了解更多。 + +我们对 Flutter 的未来充满期待,并将继续致力于我们的使命。我们由衷感谢每一位贡献者、社区成员和 Flutter 开发者,是你们让这个旅程如此精彩。我们迫不及待地想看到你们接下来的创新之作! \ No newline at end of file diff --git a/src/content/posts/index.md b/src/content/posts/index.md index 5b6f9331ff..19a534dd55 100644 --- a/src/content/posts/index.md +++ b/src/content/posts/index.md @@ -8,7 +8,10 @@ title: 官方博客 ## 2024 年 -- [新] [Flutter 首次亮相 Google Cloud Next 大会](/posts/flutter-at-google-cloud-next-2024) +- [新] [Flutter 3.24 和 Dart 3.5 现已发布](/posts/flutter-3-24-dart-3-5) +- [新] [Flutter 3.24 更新详解](/posts/whats-new-in-flutter-3-24) +- [新] [Dart 3.5 更新详解](/posts/dart-3-5) +- [Flutter 首次亮相 Google Cloud Next 大会](/posts/flutter-at-google-cloud-next-2024) - [使用 Flutter 3.19 更高效地开发](/posts/whats-new-in-flutter-3-19) - [了解 Flutter 3.16 功能更新](/posts/whats-new-in-flutter-3-16) - [Dart 3.2 更新盘点](/posts/announcing-dart-3-2) diff --git a/src/content/posts/whats-new-in-flutter-3-24.md b/src/content/posts/whats-new-in-flutter-3-24.md new file mode 100644 index 0000000000..58748b18da --- /dev/null +++ b/src/content/posts/whats-new-in-flutter-3-24.md @@ -0,0 +1,240 @@ +--- +title: Flutter 3.24 更新详解 +toc: true +--- + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/54348384c0bf3.png) + +欢迎了解最新的 Flutter 更新!Flutter 3.24 包含了令人兴奋的新功能和增强,可以提升你的应用开发体验。本次发布的亮点包括 Flutter GPU 预览版,它可以直接在 Flutter 中实现高级图形和 3D 场景渲染。Web 应用现在可以嵌入多个 Flutter 视图,增强了应用的多功能性。此外,我们还添加了视频广告变现支持,帮助你最大化收入。 + +过去几个月,Flutter 社区异常活跃,共有 852 个框架提交和 615 个引擎提交。我们很高兴欢迎 49 名新的贡献者,他们为这个版本的实现做出了贡献。正是你们的奉献和热情推动着 Flutter 不断向前发展。 + +现在就来了解 Flutter 社区为这个最新版本带来的所有新功能和增强吧! + +## Flutter 框架 + +### 新的 Sliver 组件 + +这个版本添加了新的 Sliver 组件,可以组合使用以实现动态应用栏行为: + +- SliverFloatingHeader +- PinnedHeaderSliver +- SliverResizingHeader + +你可以使用这些新的 Sliver 组件来创建在用户滚动时浮动、保持固定或调整大小的头部。这些新的 Sliver 与现有的 `SliverPersistentHeader` 和 `SliverAppBar` 类似,但 API 更简单,可以组合使用以实现更好的效果。 + +这些新的 Sliver 还附带了新的示例代码。例如,`PinnedHeaderSliver` 的 API 文档中有一个示例,重新创建了类似 iOS 设置应用的应用栏效果: + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/e842bae66bf85.gif) + +### Cupertino 库的更新 + +在这个版本中,我们改进了 `CupertinoActionSheet` 的保真度。现在在操作表的按钮上滑动手指会提供触觉反馈。按钮的字体大小和粗细现在与原生对应部分匹配。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/e9d493139bfb3.gif) + +我们还为 `CupertinoButton` 添加了新的聚焦属性,你现在可以自定义禁用状态下 `CupertinoTextField` 的颜色。 + +Cupertino 库正在进行全面更新,未来的版本中会有更多改进! + +### TreeView + +`two_dimensional_scrollables` package 发布了 `TreeView` widget,以及几个配套类,用于构建可以在所有方向滚动的高性能树形结构。package 中的示例应用也更新了几个新的使用 `TableView` 和 `TreeView` widgets 的示例。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/303bfd3271e04.gif) + +框架中还添加了 `TreeSliver`,用于在单维滚动中构建树形结构。`TreeView` 和 `TreeSliver` 的 API 是匹配的,方便你根据用例选择适合的方案。 + +### CarouselView + +这个版本包含了 Material Design 轮播组件:CarouselView。CarouselView 实现了"未限制"布局:一个可滚动的项目列表,滚动到容器边缘,前导和尾随项目在滚出视图和滚入视图时可以动态改变大小。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/b803f1723643b.gif) + +### 更多 widget 功能 + +这个版本包含了一些工作,将核心 widget 逻辑从 Material 库移到 Widgets 库中,以便更通用使用。这包括: + +- [`Feedback`](https://github.com/flutter/flutter/pull/148523) widget,提供了对设备触觉和音频反馈的简单访问,响应轻触、长按等手势。 +- [`ToggleableStateMixin`](https://github.com/flutter/flutter/pull/148272) 和 [`ToggleablePainter`](https://github.com/flutter/flutter/pull/148272),用于构建复选框、开关、单选按钮等切换 widget 的基类。 + +### AnimationStatus 的增强枚举功能 + +在社区成员 [@nate-thegrate](https://github.com/nate-thegrate) 的出色贡献中,为 [`AnimationStatus`](https://api.flutter.cn/flutter/animation/AnimationStatus.html) 添加了增强的枚举功能,包括以下 getter: + +- isDismissed +- isCompleted +- isRunning +- isForwardOrCompleted + +其中一些 getter 已经在 `Animation` 子类中存在,如 `AnimationController` 和 `CurvedAnimation`。现在所有这些状态 getter 除了在 `AnimationStatus` 中可用,在 `Animation` 子类中也可用。最后,为 `AnimationController` 添加了 [`toggle`](https://api.flutter.cn/flutter/animation/AnimationController/toggle.html) 方法来切换动画方向。 + +### SelectionArea 的更新 + +Flutter 的 [`SelectionArea`](https://api.flutter.cn/flutter/material/SelectionArea-class.html) 现在支持更多与鼠标三击和触摸设备上双击相关的原生手势。默认情况下,`SelectionArea` 和 `SelectableRegion` widgets 使用这些新手势。 + +三击 +- 三击 + 拖动:以段落块为单位扩展选择。 +- 三击:选择点击位置的段落块。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/95483979f7dba.gif) + +双击 +- 双击 + 拖动:以单词块为单位扩展选择(在原生 Android/Fuchsia/iOS 和 iOS web 上支持)。 +- 双击:选择点击位置的单词(在原生 Android/Fuchsia/iOS 和 Android/Fuchsia web 上支持)。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/549b16fa8dc4f.gif) + +## 引擎 + +### Impeller + +**改进性能和保真度** + +为了即将在稳定版中移除 iOS 上的 Impeller 选择退出选项,团队一直在努力改进 Impeller 的性能和保真度。例如,一系列对文本渲染的改进大大提高了 emoji 滚动的性能,消除了滚动大量 emoji 时的卡顿,这是对 Impeller 文本渲染能力的绝佳压力测试。 + +此外,通过解决一系列问题,我们在这个版本中也大大改进了 Impeller 的文本渲染保真度。特别是,文本粗细、间距和字距现在都与旧版渲染器的保真度相匹配。 + +![改进前(间距不正确,字体粗细也比预期的轻)](https://img-s2.andfun.cn/devrel/posts/2024/08/9e7ebac7eb802.png) + +⬆️ ⬇️ 对比 + +![改进后](https://img-s2.andfun.cn/devrel/posts/2024/08/bec1e7e580ef2.png) + +![改进前:(“vergelijken”中的间距不正确)](https://img-s2.andfun.cn/devrel/posts/2024/08/70ac5040977df.png) + +![改进后](https://img-s2.andfun.cn/devrel/posts/2024/08/8421dad937376.png) + +**Android 上的 Impeller 预览版本** + +在这个版本中,我们继续将 Android 上的 Impeller 设定为“预览版本”。由于 Android 14 中的一个 bug 影响了 Impeller 用于平台视图的 API,我们延长了预览期。Android 团队已经修复了这个 bug,但许多已部署的设备在可预见的将来仍将运行未修复的 Android 版本。解决这些问题意味着需要额外的 API 迁移,因此需要额外的稳定版本周期。出于谨慎考虑,为确保 Flutter 应用能在尽可能广泛的设备上工作,我们将推迟到今年晚些时候的稳定版本中将 Impeller 设为默认渲染器。 + +随着 Impeller 在 Android 上的预览继续进行 3.24 稳定周期,我们请求 Flutter 开发者升级到最新的稳定版本,并在启用 Impeller 时提交发现的任何缺陷问题。这个阶段的反馈对确保 Impeller 在 Android 上的成功至关重要,也让我们能够在今年晚些时候的版本中有信心将其设为默认渲染器。Android 硬件生态系统比 iOS 生态系统更加多样化。因此,关于 Impeller 最有帮助的反馈应该包括发生问题的具体设备和 Android 版本的详细信息。 + +### 改进了缩小图像的默认设置 + +在这个版本中,图像的默认 `FilterQuality` 从 `FilterQuality.low` 改为了 `FilterQuality.medium`。当一个大图像比其目标矩形小很多时(这是一种常见场景),`FilterQuality.low` 会导致图像看起来更 "像素化",渲染速度也比 `FilterQuality.medium` 慢。展望未来,团队还在探索为各种 `FilterQuality` 级别提供更合适的名称。 + +### Flutter GPU 预览 + +Flutter 通过 Flutter GPU 引入了渲染能力的重大更新,现已在主渠道上提供。这个低级图形 API 允许开发者使用 Dart 代码和 GLSL 着色器创建自定义渲染器,而无需任何原生平台代码。 + +Flutter GPU 扩展了 Flutter 的直接渲染能力,实现高级图形和 3D 场景。它需要 Impeller 渲染后端,目前支持 iOS、macOS 和 Android。尽管处于早期预览阶段,但 Flutter GPU 最终旨在支持所有 Flutter 平台。 + +该 API 允许完全控制渲染通道附件、顶点阶段和向 GPU 上传数据。这种灵活性对于创建从 2D 角色动画到复杂 3D 场景的复杂渲染解决方案至关重要。 + +开发者可以通过切换到主渠道并将 `flutter_gpu` package 添加到项目中来开始使用 Flutter GPU。接下来的几个月将看到更多功能和稳定性改进,像 `flutter_scene` 这样的高级渲染库将简化这些高级功能的使用。 + +要深入了解 Flutter GPU 并了解如何在项目中利用它,请查看详细的 [Flutter GPU 博客文章](https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11)。无论你是创建游戏还是复杂图形,Flutter 的新 GPU 功能都使其成为你的产品的强大选择。 + +## Web + +### 多视图嵌入 + +Flutter web 应用现在可以利用多视图嵌入,允许开发者同时将内容渲染到多个 HTML 元素中。这个功能被称为“嵌入模式”或“多视图”,为将 Flutter 视图集成到现有 web 应用中提供了灵活性。 + +在多视图模式下,Flutter web 应用在启动时不会立即渲染。相反,它会等待主机应用使用 `addView` 方法添加第一个"视图"。主机应用可以动态添加或删除这些视图,Flutter 会相应地调整其 widget。 + +要启用多视图模式,在 `flutter_bootstrap.js` 文件中的 `initializeEngine` 方法中设置 `multiViewEnabled: true`。然后可以从 JavaScript 管理视图,将它们添加到指定的 HTML 元素中,并根据需要删除它们。每次添加和删除视图都会触发 Flutter 内部的更新,允许动态内容渲染。 + +这个功能对于将 Flutter 集成到需要多个独立 Flutter 视图的复杂 web 应用中特别有用。它还支持每个视图的自定义初始化数据,实现个性化配置和交互式体验。 + +要深入了解如何在 Flutter web 应用中实现多视图嵌入,请查看[详细文档](https://docs.flutter.cn/platform-integration/web/embedding-flutter-web)。 + +## 变现 + +### 视频广告变现支持 + +我们推出了一个 [互动式媒体广告 (IMA) 插件](https://pub.flutter-io.cn/packages/interactive_media_ads),以支持 Flutter 移动应用上的插播视频广告变现。新的 IMA 插件在现有的主要支持展示广告格式的 [Google 移动广告 (GMA)](https://pub.flutter-io.cn/packages/google_mobile_ads) 插件之上提供了新的广告变现机会。 + +插播视频视频广告通常在视频内容播放前 (前贴片广告)、期间 (中贴片广告) 或之后(后贴片广告)向用户展示。一些插播视频广告也可以跳过。 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/209ee815c2e92.gif) + +**Flutter IMA 优势**: + +- 无缝地在 Flutter 应用的视频播放器内容中变现。例如,当应用用户点击视频内容上的播放时,你现在可以实现 Flutter IMA 插件,在开始视频内容之前先向用户展示 15 秒的广告。 +- 利用原生 IMA SDK 的相同优势,包括访问优质 Google 广告需求和行业标准合规性(如 IAB VAST — 交互式广告局视频广告服务模板)。 + +初始发布版本目前支持 Android 和 iOS 平台上的前贴片视频广告。中贴片广告支持将很快推出。我们鼓励开始在 Flutter 应用的视频内容上探索新的 IMA 插件。如果有任何问题或疑虑,请在 [GitHub](https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22) 上告诉我们。 + +资源: [插件指南](https://pub.flutter-io.cn/packages/interactive_media_ads)、[示例应用](https://pub.flutter-io.cn/packages/interactive_media_ads/example)、[Git 仓库](https://github.com/flutter/packages/tree/main/packages/interactive_media_ads) + +## iOS + +### Swift Package Manager 初步支持 + +目前,Flutter 使用 CocoaPods 来管理原生 iOS 或 macOS 依赖。 + +Flutter 3.24 增加了对 Swift Package Manager 的早期支持。这带来了几个好处,包括: + +1. 访问 Swift package 生态系统。Flutter 插件将能够利用不断增长的 [Swift package 生态系统](https://swiftpackageindex.com/)! +2. 简化 Flutter 安装。Swift Package Manager 与 Xcode 捆绑在一起。将来,开发者无需安装 Ruby 和 CocoaPods 就可以在 Apple 平台上使用 Flutter。 + +我们鼓励插件作者尝试为插件 [添加 Swift Package Manager 支持](https://docs.flutter.cn/packages-and-plugins/swift-package-manager/for-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin),并提供使用体验反馈。 + +如果对 Flutter 对 Swift Package Manager 的支持有反馈,请 [提交问题](https://github.com/flutter/flutter/issues/new/choose)。 + +## 生态系统 + +### Shared Preferences 插件更新 + +我们为 [shared_preferences](https://pub.flutter-io.cn/packages/shared_preferences) 插件添加了两个新的 `API:SharedPreferencesAsync` 和 `SharedPreferencesWithCache`。最显著的变化是 Android 实现使用 Preferences DataStore 而不是 Shared Preferences。 + +用户可以使用 `SharedPreferencesAsync` 直接调用平台获取设备上保存的最新首选项,代价是异步和比使用缓存版本稍慢。这对于可以由其他系统或 isolate 更新的首选项很有用,这会使缓存过时。 + +`SharedPreferencesWithCache` 构建在 `SharedPreferencesAsync` 之上,允许用户同步访问首选项的本地缓存副本。这类似于旧的 API,但现在可以使用不同参数多次实例化。 + +这些新 API 旨在未来取代当前的 SharedPreferences API。但是,这是生态系统中使用最广泛的插件之一,我们知道生态系统切换到新 API 需要时间。 + +### 2024 年欧洲 Flutter 和 Dart Package 生态系统峰会 + +![](https://img-s2.andfun.cn/devrel/posts/2024/08/64ac53908b4e7.png) + +作为 2024 年欧洲 Fluttercon 的一部分,我们举办了第一次面对面的 Flutter 和 Dart Package 生态系统峰会。这是继 2023 年 8 月举行的首次虚拟峰会之后的延续。你可以在 [这里](https://docs.google.com/document/d/e/2PACX-1vRFLdpIJYO5YPARcyUT1FYPzwkFb1hxh_agqnCXxsyirXocLZS5jobs3xFV5ZGpSQHLHZiBzqbJlXNV/pub) 查看讨论会的总结要点。 + +我们很高兴地宣布,下一次峰会将于 2024 年 9 月 20 日在纽约市的 [美国 Fluttercon](https://flutterconusa.dev/) 举行!如果你是一个 package 作者或贡献者,并且将参加 2024 年美国 Fluttercon,请 [注册](https://rsvp.withgoogle.com/events/flutter-package-ecosystem-summit-usa-2024) 以预留你在峰会中的位置。 + +本峰会汇集了 package 作者和维护者,就以下主题进行了非会议式的讨论: + +- 第 1 场: 原生互操作的过去、现在和未来 +- 第 2 场: 可持续的 package 维护模式 +- 第 3 场: 解决 package 生态系统碎片化 + +我们相信峰会,特别是作为更广泛的 Flutter 和 Dart 活动的一部分,是社区之间进行开放讨论的宝贵平台,可以揭示关键挑战并集思广益解决方案。我们期待未来与社区合作举办更多此类峰会。 + +## DevTools 和 IDE + +这个版本包含了对 Flutter DevTools 工具套件的一些令人兴奋的改进。 + +如果你曾经想知道你的 Flutter 应用是否构建了超出预期的 Widget 数量,DevTools Performance 工具中的一个新功能可以帮助你。使用新的 Rebuild Stats 功能,你可以捕获有关应用中或甚至特定 Flutter 帧中 widget 构建次数的信息。 + +![DevTools Performance 工具跟踪重建统计的屏幕截图](https://img-s2.andfun.cn/devrel/posts/2024/08/f8e43515f881f.png) + +我们为 Network profiler 和 Flutter Deep Links 工具等工具添加了改进和关键 bug 修复,并进行了一些总体改进,以在你从 IDE 中使用 DevTools 时提供更好的体验。说到 IDE,你知道可以直接在 IDE 中使用每个 DevTools 工具吗? + +![DevTools 屏幕在 VS Code 窗口中打开](https://img-s2.andfun.cn/devrel/posts/2024/08/ce2a270876253.png) + +![DevTools 屏幕在 Android Studio 工具窗口中打开](https://img-s2.andfun.cn/devrel/posts/2024/08/d60f73a33c768.png) + +这个版本包括对 VS Code 中 Flutter 侧边栏的改进,让你更容易访问所需的工具。升级到最新版本的 VS Code 以及 Flutter 和 Dart 扩展以访问改进的侧边栏。 + +![Flutter 侧边栏可自适应并缩放以适应工作区](https://img-s2.andfun.cn/devrel/posts/2024/08/edba074e157d1.gif) + +这个版本还包括对 [DevTools 扩展框架](https://docs.flutter.cn/tools/devtools/extensions) 的一些重大改进。现在,当你在调试 Dart 或 Flutter 测试时,甚至当你没有调试任何内容而只是在 IDE 中编写代码时,你都可以使用 DevTools 扩展(由某个 package 依赖提供的工具)。因此,如果你想为这些用户场景之一使用工具(或构建一个!),现在就可以了。 + +要了解 Flutter 3.24 中包含的所有更新的更多信息,请查看 DevTools [2.35.0](https://docs.flutter.cn/tools/devtools/release-notes/release-notes-2.35.0)、[2.36.0](https://docs.flutter.cn/tools/devtools/release-notes/release-notes-2.36.0) 和 [2.37.2](https://docs.flutter.cn/tools/devtools/release-notes/release-notes-2.37.2) 的发行说明。 + +## 破坏性改动 + +本次发布中的破坏性改动包括对 [Navigator 的 pages API ](https://docs.flutter.cn/release/breaking-changes/navigator-and-page-api)(导航页面 API) 的修改、[PopScope 中泛型类型的变化](https://docs.flutter.cn/release/breaking-changes/popscope-with-result) (将 `onPopInvoked` 方法替换为 `onPopInvokedWithResult`)、[Flutter Web 的默认渲染器的变更](https://docs.flutter.cn/platform-integration/web/renderers),以及一些新的废弃声明。你可以在 [破坏性改动页面](https://docs.flutter.cn/release/breaking-changes) 上查看完整的迁移指南。 + +一如既往,我们非常感谢社区提供 [测试用例](https://github.com/flutter/tests/blob/master/README.md) —— 这些测试用例帮助我们识别这些破坏性改动。要了解更多信息,请查看 Flutter 的破坏性改动处理政策。 + +## 结语 + +Flutter 成功的核心是你 - 我们优秀的社区。没有你们无数的贡献和不懈的热情,这个版本就无法实现。我们由衷地感谢你们。 + +为了详细了解这个版本所取得的具体成果,我们邀请你查看发布说明和变更日志,以获取 Flutter 3.24 中新增内容的完整列表。 + +现在,Flutter 3.24 以及 Dart 3.5 已经在稳定渠道上可用了。开始使用最新版本的 Flutter 就像运行 `flutter upgrade` 一样简单。我们迫不及待地想看到你们的创作! \ No newline at end of file