Flutter 3.7 更新说明

flutter 3.7 很多同学都已经升级了,然后各种 pub 社区组件报错,所以大家不要那产线的项目去升级。

这次更新内容很丰富,我们一起来看看有哪些重要的内容。

请大家用 fvm 这类工具管理多个版本 sdk 。 参考链接 https://wiki.ducafecat.tech/flutter/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/fvm%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86.html

原文

https://medium.com/flutter/whats-new-in-flutter-3-7-38cbea71133c

正文

Material 3

样式生成器 theme-builder

https://m3.material.io/theme-builder#/custom

MD3 组件展示

https://flutter-experimental-m3-demo.web.app/#/

开启

MaterialApp (
  theme : ThemeData (
    useMaterial3 : true,
    colorSchemeSeed : Colors.green,
  ),
  // …
 );

菜单栏和级联菜单

对于 macOS 可以使用 PlatformMenuBar 创建一个菜单栏,它定义了由 macOS 而不是 Flutter 渲染的原生菜单栏支持。

Impeller 渲染引擎

https://github.com/flutter/engine/tree/main/impeller

Flutter 团队相信 Impeller 的性能将达到或超过大多数应用的 Skia 渲染器,并且在保真度方面,Impeller 实现几乎覆盖了少数极端下的使用场景。

虽然目前期待的结果是 iOS 上的 Impeller 可以满足几乎所有现有 Flutter 应用的渲染需求,但 API 覆盖率仍然存在一些差距。

iOS 版本验证

https://docs.flutter.dev/deployment/ios#review-xcode-project-settings

$ flutter build ipa

命令现在会验证其中一些设置,并在发布前通知开发者是否需要对应用进行更改。

DevTools 开发工具更新

DevTools 内存调试工具新增了三个功能选项卡,Profile、Trace、Diff,它们支持所有以前支持的内存调试功能,并添加了更多功能以方便调试。

https://docs.flutter.dev/development/tools/devtools/memory

按 class 和 memory 类型分析应用的当前内存分配 调查哪些代码路径在运行时为一组 class 分配内存 差异内存快照以了解两个时间点之间的内存管理

Profile, 按 Class 和内存类型分配的当前内存。

Diff, 根据快照前后做差异对比。

Trace, 选择要跟踪的类,与应用程序交互,点击刷新,查看资料。

自定义 Context 菜单

3.7 开始可以在 Flutter 应用的任何位置创建自定义 Context 菜单,还可以使用它们来自定义内置的 Context 菜单。

https://github.com/flutter/samples/blob/main/experimental/context_menus/lib/email_button_page.dart

contextMenuBuilder 构建函数

  TextField(
    maxLines: 2,
    controller: _controller,
    contextMenuBuilder: (context, editableTextState) {
      final TextEditingValue value =
          editableTextState.textEditingValue;
      final List<ContextMenuButtonItem> buttonItems =
          editableTextState.contextMenuButtonItems;
      if (isValidEmail(value.selection.textInside(value.text))) {
        buttonItems.insert(
            0,
            ContextMenuButtonItem(
              label: 'Send email',
              onPressed: () {
                ContextMenuController.removeAny();
                Navigator.of(context).push(_showDialog(context));
              },
            ));
      }
      return AdaptiveTextSelectionToolbar.buttonItems(
        anchors: editableTextState.contextMenuAnchors,
        buttonItems: buttonItems,
      );
    },
  ),

其它组件也能用

  ContextMenuRegion(
    contextMenuBuilder: (context, offset) {
      return AdaptiveTextSelectionToolbar.buttonItems(
        anchors: TextSelectionToolbarAnchors(
          primaryAnchor: offset,
        ),
        buttonItems: <ContextMenuButtonItem>[
          ContextMenuButtonItem(
            onPressed: () {
              ContextMenuController.removeAny();
              Navigator.of(context).push(_showDialog(context));
            },
            label: 'Save',
          ),
        ],
      );
    },
    child: const SizedBox(
      width: 200.0,
      height: 200.0,
      child: FlutterLogo(),
    ),
  ),

更多代码示例

https://github.com/flutter/samples/tree/main/experimental/context_menus

CupertinoListSection 和 CupertinoListTile 小部件

Cupertino 新增了两个新的 Widget,CupertinoListSection 和 CupertinoListTile,用于显示 iOS 风格的可滚动小部件列表。

它们是 Material ListView 和 ListTile 的 Cupertino 版本。

滚动改进

  • 触控板交互改进
  • 新的 Widget(如 Scrollbars 和 DraggableScrollableSheet)
  • 滚动 Context 文本选择的改进处理

修复列表如下

https://github.com/flutter/flutter/issues?page=1&q=is%3Aissue+is%3Aclosed+closed%3A2022-07-11..2022-11-30+label%3A%22f%3A+scrolling%22+reason%3Acompleted

另外还有新的 AnimatedGrid 和 SliverAnimatedGrid 动画。

ListView.builder 中允许 itemBuilder 为 null。

https://github.com/flutter/flutter/pull/108706

国际化工具和文档

国际化支持已经全面改进,3.7 版本通过完全重写了 gen-l10n 工具来实现支持:

  • 描述性的语法错误
  • 涉及嵌套/多个复数、选择和占位符的复杂消息

https://docs.flutter.dev/development/accessibility-and-localization/internationalization

全局选择改进

SelectionArea 现在支持键盘选择,开发者可以使用键盘快捷键扩展现有选择,例如 shift+right。

后台 isolates

3.7 开始 Platform Channels 可以从任何 Isolate invoked , 以前用户只能从 Flutter 提供的主 Isolate 调用平台通道,而现在 Plugins 或 Add-to-app 能更好地使用 Isolate 和主机平台代码进行交互。

参考:

  • Writing custom platform-specific code https://docs.flutter.dev/development/platform-integration/platform-channels
  • Add Flutter to existing app https://docs.flutter.dev/development/add-to-app
  • Developing packages & plugins https://docs.flutter.dev/development/packages-and-plugins/developing-packages

文本放大镜

3.7 开始在 Android 和 iOS 上选择文本时出现的放大镜。

对于所有带有文本选择的应用,这是开箱即用的能力,但如果你想禁用或自定义它,请参阅 magnifierConfiguration 属性。

https://master-api.flutter.dev/flutter/material/TextField/magnifierConfiguration.html

插件的快速迁移

由于 Apple 现在专注于使用 Swift 作为他们的 APIs ,我们希望开发参考资料以帮助 Flutter 插件开发人员使用 Swift 迁移或创建新插件。

https://pub.dev/packages/quick_actions

代码

https://github.com/flutter/plugins/tree/main/packages/quick_actions

各种指引手册

https://docs.flutter.dev/get-started/flutter-for/swiftui-devs

已删除对 bitcode 的支持

默认情况下,Flutter 应用不启用位码,我们预计这不会影响许多开发人员。 但是如果你在 Xcode 项目中手动启用了 bitcode,请在升级到 Xcode 14 后立即禁用它。 你可以通过打开 ios/Runner.xcworkspace 并将 Enable Bitcode 设置为 No 来实现,Add-to-app 的开发人员可以在宿主 Xcode 项目中禁用它。

iOS PlatformView BackdropFilter

我们添加了在有 blurred 效果的 Flutter Widget 下方呈现时使原生 iOS 视图模糊的功能,并且 UiKitView 现在可以包装在 BackdropFilter。

设计说明

https://docs.google.com/document/d/1V7Jc_RGaknrBBPPBBKB8lT7f3PKhYr8sin35MSMFAf4/edit

内存管理

3.7 版本对内存管理进行了一些改进,具体有:

  • 减少垃圾收集暂停导致的卡顿
  • 由于分配速度和后台 GC 线程而降低 CPU 利用率
  • 减少内存占用
  • 在此版本中,Flutter Engine 还更好地利用了有关 Flutter 应用状态的信息来动态更新 Dart VM。
  • 在低延迟模式下,Dart VM 的内存分配器会倾向堆增长而不是垃圾收集,以避免因 GC 暂停而中断过渡动画。
  • 此外,本次还 修复了 Flutter 引擎空闲时通知 Dart VM 的 逻辑错误,修复这些错误可以防止与 GC 相关的卡顿。
  • 对于 add-to-app 的 Flutter 应用,当 Flutter 视图不再显示时 Flutter 会通知 Dart VM 引擎,当没有 Flutter 视图可见时,Dart VM 为与视图关联的对象触发 GC ,此更改可以减少了 Flutter 的内存占用。

停用 macOS 10.11 到 10.13

Flutter 不再支持 macOS 10.11 和 10.12 版本,3.7 版本发布后,也取消对 10.13 的支持,这可以并将帮助团队大大简化代码库。

这也意味着在 3.7 版本及以后版本中针对稳定的 Flutter SDK 构建的应用将不再适用于这些版本,并且 Flutter 支持的最低 macOS 版本增加到 10.14 Mojave。

toImageSync

3.7 版本在 dart:ui 里 添加了 Picture.toImageSync 和 Scene.toImageSync 方法。

https://github.com/flutter/engine/pull/33736

当 GPU 上下文可用时,图像将保持为 GPU 常驻状态,这意味着会比 toImage 具有更快的渲染速度(生成的图像也可以保留在 GPU 中,但这种优化尚未在该场景中实现。)

自定义 shader 改进

3.7 版本包含了对 Flutter 对自定义片段着色器支持的大量改进。

Flutter SDK 现在包含一个着色器编译器,可将 pubspec.yaml 文件中列出的 GLSL 着色器编译为目标平台的正确特定格式。

此外,自定义着色器现在可以热加载,iOS 上的 Skia 和 Impeller 后端现在也支持自定义着色器。

文档说明

https://docs.flutter.dev/development/ui/advanced/shaders

字体热重载

以前向 pubspec.yaml 文件添加新字体需要重新运行应用才能看到它们,这个行为这与其他可以热加载的 asset 不同。

现在,对字体清单的更改(包括添加新字体)可以热加载到应用中。

减少 iOS 设备上的动画卡顿

感谢 luckysmg 的开源贡献改进减少了 iOS 上的动画卡顿,特别是手势期间在主线程上添加虚拟 CADisplayLink 对象,现在会强制以最大刷新率进行刷新。

此外,键盘动画现在将刷新率设置为 CADisplayLink ,与 Flutter 引擎动画使用的刷新率相同。

由于这些变化,用户应该注意到 120Hz iOS 设备上的动画更加一致流畅。

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~

猫哥课程


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://ducafecat.com

Last Updated:
Contributors: ducafecat