如何在Dart 3.8中配置更新后的代码格式化工具

2025年2月,Flutter 3.29Dart 3.7正式发布,带来了许多新功能和改进。虽然有些变化可能不会立即对您产生影响,但有一项更新会影响到每一位Flutter开发者:新的Dart格式化工具。这一变化影响重大,除非您明确选择退出,否则您的代码库中将出现大量的格式更改。本文将引导您了解这些新变化以及所有配置选项,帮助您顺利应对

我们开始吧!

更新内容:Dart 3.8(作为Flutter 3.32的一部分)添加了一个新的格式化选项,用于保留尾随逗号。这一点非常重要,因为这意味着您可以升级SDK,但如果不喜欢新风格,仍然可以选择退出。下面将详细介绍这一点。

旧的格式化工具是如何工作的?

在Dart 3.7之前,您可以控制尾随逗号的使用。以这个部件构造函数为例:

以下是旧格式化工具的行为:

  • 添加 尾随逗号→格式化工具会将其拆分为多行。
  • 删除 尾随逗号→格式化工具会将代码内联(如果适合页面宽度)。

虽然这种方式具有一致性,但它要求您为代码库中的所有参数列表和Widgets 决定是否添加或删除尾随逗号(并且在代码审查时可能会为此争论😞)。为了解决这个问题,Dart 3.7引入了新的格式化风格

新的格式化工具是如何工作的?

现在,格式化工具会自动决定是否添加或删除尾随逗号。

  • 如果参数列表适合最大页面宽度 ,格式化工具会删除尾随逗号并将其保持内联:
  • 如果参数列表超过最大页面宽度,格式化工具会添加尾随逗号并将其拆分为多行:

总结:新旧格式化工具对比

旧格式化工具 新格式化工具
添加尾随逗号→拆分为多行 代码适合单行→删除尾随逗号并内联代码
删除尾随逗号→内联代码 代码超过页面宽度→添加尾随逗号并拆分为多行

这对您意味着什么?

如果您的pubspec.yaml仍然使用Dart 3.6或更低版本,目前不会有任何变化:

yaml 复制代码
environment:
  sdk: ^3.6.0

但一旦您明确升级到Dart 3.7或更高版本,新的格式化工具就会生效:

yaml 复制代码
environment:
  sdk: ^3.7.0

届时...您的代码库中将出现大量差异。

⚠️ 重要提示 :格式化在保存时应用 一旦您保存文件,新的格式化风格就会应用,导致大量差异

为避免混乱,请一次性将新格式化工具应用于整个代码库

bash 复制代码
# 从项目根目录运行
dart format .

这将确保所有格式化更改一致应用。我建议将此作为单个PR推送,并在进行其他更改之前合并:

bash 复制代码
# 一次性推送所有更改
git add .
git commit -m "Apply the new formatter"
git push

供参考,当我将新格式化工具应用于我的Flutter Tips App应用时,最终得到了一个包含1200多个更改的PR,约占总行数的25%:

页面宽度呢?

我们回顾一下,新的格式化工具会根据最大页面宽度(也就是行长度)来决定如何格式化代码。这可以在您的analysis_options.yaml文件中配置:

yaml 复制代码
formatter:
  page_width: 120

更改此设置并再次运行dart format将相应地重新格式化整个代码库。

关键要点:为您的项目和团队选择一个合适的页面宽度,并保持一致。👍

代码生成的文件呢?

当您运行dart format .时,它会应用于项目中的所有Dart文件,包括生成的文件。但有一个问题:build_runner不遵循您的page_width设置。大多数代码生成器会以固定的80字符行宽格式化输出,这意味着生成的文件可能与您项目的格式不匹配。

这对您来说意味着什么:

  • 如果您的page_width为80(默认值),一切都不会有问题。
  • 如果您使用自定义页面宽度,每当您运行build_runner时,生成的文件将恢复为80字符的换行。

这并不是一个大问题,因为您只需要对整个项目运行一次格式化工具(如前所述)。

未来改进 :根据这条评论,未来的Dart格式化工具更新将允许从格式化中排除特定文件,这可能有助于解决这个问题。

Dart 3.8中更新的格式化工具呢?

当2023年首次讨论新格式化工具时,有人担心由于换行不考虑代码的语义含义,会导致格式不一致。经过更多讨论后,Dart团队同意在Dart 3.8中添加一个新的格式化选项来保留尾随逗号。

这意味着您可以升级到Dart 3.8:

yaml 复制代码
# pubspec.yaml
environment:
  sdk: ^3.8.0

然后,您必须在两个选项之间做出选择:

  1. 保留尾随逗号 在您的analysis_options.yaml文件中启用此选项:
yaml 复制代码
# analysis_options.yaml
formatter:
  trailing_commas: preserve

实际上,这会禁用新格式化工具的行为,并让您重新控制尾随逗号。

  1. 不保留尾随逗号(默认格式化风格) 如前所述,新的格式化风格会在适合页面宽度的代码中去除尾随逗号,因此您的代码库中会出现大量差异。

为了顺利处理这一点,请按照以下步骤操作:

  • analysis_options.yaml中设置自定义page_width(可选但推荐):
yaml 复制代码
# analysis_options.yaml
formatter:
  page_width: 120
  • 将格式化工具应用于整个代码库:
bash 复制代码
# 从项目根目录运行
dart format .
  • 再次运行build_runner以更新生成的文件:
bash 复制代码
# 更新代码生成的文件
dart run build_runner watch -d
  • 将更改作为单个PR推送,然后在继续开发之前合并:
bash 复制代码
# 一次性推送所有更改
git add .
git commit -m "Apply the new formatter"
git push

虽然新的格式化工具可以安全使用,但Flutter 3.32是全新发布的,可能仍会出现错误。如果您不着急,建议等待热修复版本发布后再升级。

相关推荐
Ticnix5 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人5 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl5 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人5 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼5 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空5 小时前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
Mr Xu_5 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus5 小时前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空5 小时前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范