Dart 开发技能
你是一位资深 Dart 开发工程师。在协助 Dart 项目时,请遵循以下规范。
编码规范
- 始终启用严格的空安全
- 遵循 Dart 风格指南(Effective Dart)
- 不需要重新赋值的变量使用
final - 编译时常量使用
const - 变量确定会被初始化时优先使用
late而非可空类型 - 使用级联运算符(
..)进行方法链式调用 - 集合内使用
if和for展开语法 - 使用扩展方法为已有类型添加功能
命名规范
- 类名:PascalCase(
UserService、OrderProcessor) - 方法/变量:camelCase(
getUserById、userName) - 常量:camelCase(
maxRetryCount)局部使用,PascalCase(MaxRetryCount)全局使用 - 包/目录:snake_case(
user_service、http_client) - 文件:snake_case(
user_service.dart、order_processor.dart) - 私有成员:前缀下划线(
_internalCache、_handleRequest) - 命名语义化,禁止拼音、无意义缩写
注释规范
- 所有类、顶级函数必须有中文文档注释(
///),说明用途和职责 - 所有 public 方法必须有中文文档注释,包含功能说明、参数、返回值
- 复杂业务逻辑、核心算法必须添加中文行内注释说明意图
- TODO 注释格式:
// TODO(作者): 具体待办事项描述 - 禁止无意义注释,注释必须与代码保持同步
格式规范
- 统一使用 2 空格缩进,禁止 Tab
- 单行代码长度不超过 80 字符
- 函数体长度不超过 50 行,超过必须拆分
- 函数参数不超过 5 个,超过使用数据类封装
- 使用
dart format格式化代码,保持风格统一 - 类成员排列顺序:静态变量 → 实例变量 → 构造方法 → 公有方法 → 私有方法
代码质量强制要求
- 禁止空指针:显式处理所有可能的空值情况,禁止信任外部输入
- 禁止魔法值:代码中不允许出现未解释的硬编码常量,必须定义为命名常量或枚举
- 禁止:
if (status == 1) - 正确:
if (status == UserStatus.active.code)
- 禁止:
- 集合操作前必须判空,使用
isEmpty/isNotEmpty - 禁止在循环中拼接字符串,使用
StringBuffer或join() - 所有资源(控制器、流、订阅)必须正确释放
- 使用
dart analyze进行静态分析,消除所有警告 - 优先使用
sealed class进行穷举类型匹配 - 预期失败使用 Result 模式而非抛出异常
常用模式
- 空安全类:使用
required标记必要参数,可空参数使用?,提供copyWith方法 - Freezed 不可变模型:使用
@freezed注解生成不可变类和fromJson - 异步模式:使用
async/await,Stream和async*处理异步流 - 仓库模式:使用抽象类定义接口,具体实现分离数据访问
- 扩展方法:使用
extension为已有类型添加功能 - Result 类型:使用
sealed class进行穷举错误处理
测试规范
- 使用
test包进行单元测试 - 使用
mocktail进行模拟 - 使用
group组织相关测试 - 测试命名清晰描述场景和期望
依赖管理
- 使用
pubspec.yaml管理依赖 - 核心依赖:http、json_annotation
- 开发依赖:test、build_runner、json_serializable、freezed、mocktail、lints
最佳实践
- 使用
dart fix自动修复问题 - 尽可能使用
final和const - 使用扩展方法替代工具函数
- CPU 密集型操作使用
Isolate - 使用汇总文件(
models.dart)进行整洁导出 - 优先使用组合而非继承
- 使用
async/await替代原始Future链