Flutter 3.47 新特性

Lobsters Hottest 工具

摘要

Flutter 3.47 引入了独立的 material_ui 和 cupertino_ui 包,默认在桌面上启用 Impeller 渲染,为即将到来的 iOS 和 macOS 工具链更新做好准备,并稳定了 Flutter Widget Previews。

<p><a href="https://lobste.rs/s/p02oa2/what_s_new_flutter_3_47">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/13 15:25

# Flutter 3.47 新特性 来源:https://flutter.dev/blog/whats-new-in-flutter-3-47 Flutter 3.47 来了,随之而来的还有一些令人兴奋的新更新。今天,我们欢迎独立包 `material_ui` (https://pub.dev/packages/material_ui) 和 `cupertino_ui` (https://pub.dev/packages/cupertino_ui) 的 1.0 版本。这是一个重要的里程碑,标志着设计系统与核心 SDK 的解耦。我们还在全面推动性能和工具链的提升。这个版本让 Impeller 默认应用于桌面端,为 iOS、macOS 和 Xcode 27 准备我们的管道,并将 Flutter Widget Previews 升级为稳定版。所以,在你的终端中运行 `flutter upgrade` 开始吧,或者继续阅读以了解更多关于此版本主要变化的信息。 --- ## 选择你自己的 UI 冒险 Flutter 走向解耦的第一步已经到来:Material 和 Cupertino 现在作为独立的包提供!Flutter 最大的优势之一是其渲染像素级完美 Material 和 Cupertino 组件的能力。然而,由于这些设计库历史上直接捆绑在核心 SDK 中,这拖慢了它们的开发速度,并加大了贡献或保持更新的难度。虽然核心 SDK 在这个版本中仍然包含这些库,但你现在可以选择使用独立包 `material_ui` 和 `cupertino_ui`,它们已经在 `pub.dev` 上正式达到 1.0 版本。 ### 解耦设计路线图(可选加入) 通过选择解耦的设计系统,你可以掌控自己的设计路线图。因为 `material_ui` 和 `cupertino_ui` 现在位于 `pub.dev` 上,它们可以按照自己的每周计划独立发布错误修复和新组件,而无需等待 Flutter SDK 的季度发布。解耦设计系统给我们带来了以下好处: - 你可以在不必强制升级整个 Flutter SDK 版本的情况下,使用最新的 Cupertino 和 Material 组件样式。 - 我们可以更快、更频繁地合并贡献和更新。 - 我们为风格中立的 Flutter 核心组件目录奠定了基础,使未来构建自定义设计系统变得更加容易。 ### 如何迁移 要将你的项目迁移到新的独立包,请运行以下命令: ```bash dart fix --apply --code=migrate_design_widgets ``` 这个工具会自动将你的导入从 `package:flutter/material.dart` 和 `package:flutter/cupertino.dart` 更新到新的独立包。 > **注意:** 如果迁移工具在更新你的 `pubspec.yaml` 时遇到问题(一个已知的早期错误),你可以通过手动运行 `flutter pub add material_ui`(如果你使用 `cupertino_ui`,也添加它),然后再次运行 `dart fix --apply` 来解决。核心 SDK 中的原始设计库计划在即将到来的 11 月份秋季稳定版中正式废弃。如果你正在迁移生态中的某个包,请将以独立包的迁移视为一个主版本变更。 ### 桥接迁移差距 为了促进生态向新的独立设计库迁移时的平滑过渡,`material_ui` 和 `cupertino_ui` 附带迁移工具。`MaterialUiCompatibilityBridge` 允许你的应用程序立即迁移到独立包,即使你的一些包依赖仍然使用旧版核心 SDK 导入。例如,你可以将应用包装在兼容桥中: ```dart import 'package:material_ui/material_ui.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)), ), builder: (BuildContext context, Widget? child) { return MaterialUiCompatibilityBridge(child: child!); }, home: const HomeScreen(), ); } } ``` ### 解耦本地化 作为这次过渡的一部分,`flutter_localizations` 也被拆分了。Material 和 Cupertino 组件的本地化委托和翻译字符串现在分别位于 `package:material_ui` 和 `package:cupertino_ui` 中。 之前: ```dart import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter/material.dart'; // ... localizationsDelegates: const [ GlobalCupertinoLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], ``` 之后: ```dart import 'package:material_ui/material_ui.dart'; // ... localizationsDelegates: GlobalMaterialLocalizations.delegates, ``` 将 `localizationsDelegates` 设置为 `GlobalMaterialLocalizations.delegates` 现在也会包含 Cupertino 和 Widgets 委托,简化了你的配置。 展示包拆分过程的架构图 解耦本地化结构 ### 开放贡献 通过在 4 月份冻结对 Material 和 Cupertino 库的贡献,我们得以确保平滑迁移。在 `material_ui` 和 `cupertino_ui` 中等待你的库与你已经在使用的库是相同的。既然我们已经准备好解除冻结,请期待新包中定期推出的更多修复和功能,目前计划每周发布。我们也非常高兴地正式向社区贡献者开放这些包。 --- ## 为下一波 Apple 更新做准备 随着 Xcode 27、iOS 27 和 macOS 27 在今年秋季推出,我们大力投入以确保 Flutter 为即将到来的更新做好准备。为了确保你的用户不会遇到第一天就出现的意外,我们建议现在就用 Apple 测试版来测试你的应用。此外,为了支持 Xcode 27,最低支持的操作系统版本已经提升: | 平台 | 之前的最低版本 | 新的最低版本(Flutter 3.47+) | | --- | --- | --- | | iOS | 13 | 15 | | macOS | 10.15 | 12 | ### UIScene 生命周期要求 iOS 27 SDK 现在要求所有基于 UIKit 的应用强制使用 `UIScene` 生命周期。使用 Xcode 27 构建且未采用 `UIScene` 的应用将在启动时无法运行。对于大多数应用,Flutter CLI 会在构建过程中自动处理迁移。但是,如果你在 `AppDelegate` 中有自定义原生代码,或者使用的插件仍然依赖旧版应用生命周期,则需要手动迁移。在这些情况下,你必须按照 UIScene/Delegate 采用指南手动迁移。 ### 逐步淘汰 Intel Mac 与 Apple 转向 Apple Silicon 保持一致,Flutter 正在逐步减少对基于 Intel 的 Mac 的支持。我们已经禁用了在 Intel 硬件上的自动化测试运行,Flutter CLI 现在在 Intel 主机上构建或针对双架构构建时会打印警告。这些警告将在未来的版本中变成错误。你可以立即通过运行 `flutter config --enable-macos-arm64-only` 来选择构建仅支持 ARM64 的 macOS 应用。 ### Swift Package Manager 进展 社区在向 Swift Package Manager 迁移方面取得了非凡进展,前 100 个 iOS 插件中有 92 个已经迁移。如果你之前关闭了 Swift Package Manager,你可以通过运行 `flutter config --enable-swift-package-manager` 再次尝试。由于 CocoaPods 现在处于维护模式,未迁移到 SwiftPM 的插件最终将停止工作。未迁移的插件也会在 `pub.dev` 上获得更低的评分。如果你维护插件,请查阅迁移指南(https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-plugin-authors)并阅读我们之前的博客文章(https://flutter.dev/blog/saying-goodbye-to-cocoapods-swift-package-manager-is-soon-the-default-in-flutter)了解更多详情。本版本还优化了构建时间,这要感谢社区贡献者 @lukemmtt(https://github.com/lukemmtt),他通过在构建过程早期过滤掉不必要的 SwiftPM 包方案,改进了构建管道。 --- ## 设定 Wasm 默认化的方向 我们正在积极推动 Flutter Web 应用默认启用 WebAssembly(Wasm),为浏览器带来原生级别的性能。如果你还没有用 Wasm 测试过 Web 应用,现在就可以通过将 `--wasm` 标志添加到 release 构建命令来选择加入: ```bash flutter build web --release --wasm ``` 在准备这一转变时,请记住 Wasm 要求你将代码库迁移到新的 JS interop 包(`package:web`),因为旧的 `dart:html` 库不受支持。升级项目的包依赖通常会自动解决这些旧版 interop 问题。为了帮助扩展更大的 Web 应用,此版本还引入了对 Wasm 上延迟加载的实验性支持。该功能在 main channel 上以标志形式提供,允许你将 Wasm 应用拆分为更小的、懒加载的模块,从而优化初始加载时间: ```bash flutter build web --release --wasm --enable-wasm-deferred-loading ``` --- ## Impeller 为桌面端带来现代图形渲染 我们致力于让桌面平台成为高性能图形的一等公民。在 Flutter 3.47 中,Impeller 成为 macOS、Windows 和 Linux 的默认渲染器。如果你对 Impeller 还不熟悉,它是 Flutter 的下一代渲染引擎,从头开始构建以取代 Skia。通过针对现代硬件 API(如 macOS 上的 Metal,以及 Windows 和 Linux 上的 Vulkan),Impeller 在构建时编译一组固定的着色器,而不是在运行时动态编译。这消除了动画首次播放时可能出现的短暂卡顿,即着色器编译抖动,让你从第一帧开始就体验到始终平滑的过渡。在 Impeller 渲染引擎文档中了解更多。如果你需要临时退出 Impeller,请按照以下步骤操作: - macOS:在 `Info.plist` 中设置 `FLTEnableImpeller` 为 `false`。 - Windows:在 `main.cpp` 中添加 `project.set_impeller_switch(flutter::ImpellerSwitch::Disabled)`。 - Linux:在 `my_application.cc` 中调用 `fl_dart_project_set_enable_impeller(project, FALSE)`。 回退选项将在未来的版本中移除,所以如果你必须回退到 Skia,请提交 bug。此外,Wide Gamut Color 现在在 macOS 上默认启用,在支持的硬件上呈现丰富、鲜艳、精确的色彩。 ### 实验性多窗口进展 与 Canonical 合作,并感谢维护者 @robert-ancell(https://github.com/robert-ancell)和 @mattkae(https://github.com/mattkae),我们正在扩展实验性桌面窗口 API。Linux 和 Windows 现在支持弹出窗口,让你能够构建原生上下文菜单和工具面板。 Win32 上的弹出窗口 你现在还可以在特定平台的控制器上查询 `windowHandle`,以直接获取底层原生窗口(`HWND`、`NSWindow` 或 `GtkWindow`)的指针。这支持高级原生功能访问,例如 Windows 上的可停靠面板,比如由 @orestesgaolin(https://github.com/orestesgaolin)贡献的这个可停靠面板演示: 可停靠面板演示 我们还解决了几个窗口焦点和实现的问题。在 Windows 上,激活一个窗口不再会把背景窗口拉到前面,或者在应用恢复时夺走焦点,这要归功于贡献者 @9AZX(https://github.com/9AZX): Windows 上的窗口焦点和实现修复 在 Linux 上,多窗口创建现在会在窗口从合成器收到第一帧之前显式实现窗口,修复了早期渲染警告和合成器断言。我们还添加了一个新的适应内容大小 API,让你可以创建自动调整为内容大小的常规窗口和对话框窗口。 ### 桌面端的 Flavors Windows 和 Linux 现在支持 Flutter flavors。例如,你的 `pubspec.yaml` 文件可以在不同 flavors 上使用不同的资源: ```yaml flutter: assets: - path: assets/flavor_a/images flavors: - flavor_a - path: assets/flavor_b/images flavors: - flavor_c ``` 使用 `--flavor` 选项来指定你的 flavor。例如: - `flutter build windows --flavor flavor_a` - `flutter build linux --flavor flavor_a` 感谢 @AngeloAvv(https://github.com/AngeloAvv)做出的精彩贡献! - https://github.com/flutter/flutter/pull/187034 - https://github.com/flutter/flutter/pull/187029 ### 更锐利的桌面文字 桌面屏幕通常比移动显示的像素密度更低,但拥有更多的图形计算能力。为了在桌面上呈现更清晰的文字和更干净的矢量曲线,使用 Impeller 的 Flutter 引擎现在在 macOS、Linux 和 Windows 上采用有向距离场(SDF)渲染。 --- ## GenUI 的稳定预览与更新 ### Widget Previews 转为稳定版 Flutter Widget Preview 现已稳定,允许你即时渲染、检查和迭代单个 UI 组件,而无需构建或启动整个应用程序。借助这个稳定版本,你可以期待: - 更快的启动时间,这要归功于 `.widget_preview/` 文件夹中的本地项目缓存,消除了重复设置的开销。 - 更灵活的测试,借助抽象的 `PreviewThemeData` API,该 API 支持顺序主题分层,用于复杂矩阵测试。 - 预览 Web 组件时自动同步 Web 资源,直接复制宿主项目的 `web/` 资源,并在使用 Flutter Web 时自动应用任何自定义主题或自定义你的 `index.html` 文件。 ### GenUI 的持续进展 Flutter 生态系统持续发展,以满足开发人员使用 GenUI 为用户创建新型代理体验的需求。`genui` 包的 0.10.0 版本最近发布,带来了许多修复和新功能,其中包括: - 一个新的 `a2ui_core` 包,集中了与协议相关的类,包括表达式、目录项等。 - 支持 A2UI 的客户端函数,使你能够为代理提供可以指示客户端使用的函数,用于验证、派生值和其他无需往返的小任务。 --- ## 打磨平台体验 本节重点介绍社区和 Flutter 团队为提高所有平台上的开发者和用户体验而做出的有针对性的改进。 ### Android 在 Android 上,我们解决了虚拟键盘的一个问题,即修饰键(如 Shift)在事件期间可能被卡住。键响应器现在会跳过虚拟键盘输入的物理按键合成,保持键盘交互干净。 ### Android 依赖矩阵 为确保构建稳定,Flutter 3.47 已针对以下 Android 依赖版本进行了验证: - Java:17(最低要求版本) - Kotlin Gradle 插件(KGP):2.4.0 - Android Gradle 插件(AGP):9.1.0(与 KGP 2.4.0 兼容的最新版本) - Gradle:9.3.1(AGP 9.1.0 所需的最低版本) 为确保你的应用程序在未来的版本中成功构建,我们鼓励你在构建文件中使用 Flutter SDK 提供的标准 API 级别变量。对于此版本,它们的默认值配置如下: - `flutter.compileSdkVersion`(API 36) - `flutter.targetSdkVersion`(API 36) - `flutter.minSdkVersion`(API 24) ### iOS 和 macOS 对于 iOS 开发者,代码签名现在更加透明。感谢社区成员 @alex-medinsh(https://github.com/alex-medinsh),CLI 在选择证书时会同时显示团队 ID 和团队名称。此外,社区成员 @mozammal-hossain(https://github.com/mozammal-hossain)通过提供更清晰的配置文件错误信息来改善故障排除体验,当签名失败时。 ### 桌面平台 桌面平台也得到了有针对性的改进。Windows 上的韩文文本组合光标定位问题已解决(感谢 @CHOIgoung(https://github.com/CHOIgoung)),Windows 插件现在可以使用 `FlutterEngine::PostPlatformThreadTask` 将昂贵任务从平台线程移出。在 Linux 上,@CodeDoctorDE(https://github.com/CodeDoctorDE)添加了触控笔旋转和压力支持。

相似文章

Canonical 接手 Flutter 桌面维护与路线图

Lobsters Hottest

在 Google I/O 2026 上,Google 宣布 Canonical 将担任 Flutter 桌面版(Windows、macOS 和 Linux)的首席维护者和战略管理者,这标志着治理权的转移。此举利用了 Canonical 深厚的技术专长,因为 Canonical 已将 Flutter 设为 Ubuntu 桌面应用的默认框架。

iOS 27 测试版中我已经爱上的5件事

The Verge

文章重点介绍了iOS 27开发者测试版中的五个非AI功能,包括Liquid Glass透明度滑块、更新后的应用图标、独立音量控制、超大尺寸小组件以及新的手电筒界面。

WinUI 3 性能:一次飞跃

Hacker News Top

WinUI 是 Windows 应用的现代 UI 层,属于 Windows 应用 SDK 的一部分,提供流畅设计(Fluent Design)控件和样式,用于在 Windows 10 及更高版本上构建高性能应用程序。

flutter/flutter

GitHub Trending (daily)

Flutter 是 Google 的开源 SDK,用于从单一代码库构建美观、快速的跨平台应用。这是 Flutter 的官方 GitHub 仓库。