Flutter/Dart 代码审查最佳实践
适用于审查 Flutter/Dart 应用程序的全面、与库无关的清单。无论使用哪种状态管理方案、路由库或依赖注入框架,这些原则都适用。
1. 通用项目健康度
- [ ] 项目遵循一致的文件夹结构(功能优先或分层优先)
- [ ] 关注点分离得当:UI、业务逻辑、数据层
- [ ] 部件中无业务逻辑;部件纯粹是展示性的
- [ ]
pubspec.yaml是干净的 —— 没有未使用的依赖项,版本已适当固定 - [ ]
analysis_options.yaml包含严格的 lint 规则集,并启用了严格的分析器设置 - [ ] 生产代码中没有
print()语句 —— 使用dart:developerlog()或日志包 - [ ] 生成的文件 (
.g.dart,.freezed.dart,.gr.dart) 是最新的或在.gitignore中 - [ ] 平台特定代码通过抽象进行隔离
2. Dart 语言陷阱
- [ ] 隐式动态类型:缺少类型注解导致
dynamic—— 启用strict-casts,strict-inference,strict-raw-types - [ ] 空安全误用:过度使用
!(感叹号操作符)而不是适当的空检查或 Dart 3 模式匹配 (if (value case var v?)) - [ ] 类型提升失败:在可以使用局部变量类型提升的地方使用了
this.field - [ ] 捕获范围过宽:
catch (e)没有on子句;应始终指定异常类型 - [ ] 捕获
Error:Error子类型表示错误,不应被捕获 - [ ] 未使用的
async:标记为async但从未await的函数 —— 不必要的开销 - [ ]
late过度使用:在可使用可空类型或构造函数初始化更安全的地方使用了late;将错误推迟到运行时 - [ ] 循环中的字符串拼接:使用
StringBuffer而不是+进行迭代式字符串构建 - [ ]
const上下文中的可变状态:const构造器类中的字段不应是可变的 - [ ] 忽略
Future返回值:使用await或显式调用unawaited()来表明意图 - [ ] 在
final可用时使用var:局部变量首选final,编译时常量首选const - [ ] 相对导入:为…