基于 分离 + CodeGen 映射 的最佳实践开发流程,涵盖从领域建模到 DTO、映射、仓库实现、UseCase、ViewModel、UI,再到各层单元/集成测试和 CI 集成。按此流程,既能保持清晰分层,又能用工具最大化减少样板、提高维护效率。
一、领域层(Domain)
定义实体(Entity)和值对象(Value Object)
1 | // lib/features/members/domain/entities/member_entity.dart |
定义领域请求/响应模型
1 | // lib/features/members/domain/entities/member_update_item.dart |
定义仓库接口
1 | // lib/features/members/domain/repositories/member_repository.dart |
二、数据层(Data / Infrastructure)
1. 定义 DTO(只做 JSON 序列化)
在 lib/features/members/data/dto/ 下,用 @JsonSerializable(fieldRename: FieldRename.snake):
1 | // member_dto.dart |
同理定义 MemberUpdateItemDto, ManagerCreationInfoDto, SupportCreationInfoDto, MemberCreationResponseDto 等。
2. 生成序列化代码
1 | flutter pub run build_runner build --delete-conflicting-outputs |
3. 写 Mapper Extension(DTO → Entity)
1 | // lib/features/members/data/mappers/member_mapper.dart |
三、仓库实现(RepositoryImpl)
1 | // lib/features/members/data/repositories/member_repository_impl.dart |
四、应用层(Application)
为每个业务场景写 UseCase。
1. LoadMembersUseCase
1 | class LoadMembersUseCase { |
2. UpdateMemberStatusUseCase
1 | class UpdateMemberStatusUseCase { |
3. CreateMembersUseCase
1 | class CreateMembersUseCase { |
五、表现层(Presentation)
1. State + ViewModel
定义状态类和 StateNotifier,注入 UseCase。
1 | class MembersState { /* status, list, error */ } |
2. Provider 注册
1 | final loadUseCaseProvider = Provider((ref) => LoadMembersUseCase(ref.read(repo))); |
3. Widget 调用
1 | class MembersPage extends ConsumerWidget { |
六、测试策略
1. 单元测试(UseCase/Mapper/ViewModel)
- UseCase:用 Mockito 生成
MockMemberRepository,测试execute成功/失败分支。 - Mapper:给一个 DTO 测
dto.toEntity()输出符合预期。 - ViewModel:用
ProviderContaineroverride UseCase Provider,驱动 state 变化测试。
2. 集成测试(RepositoryImpl)
在专门的测试环境上跑 MemberRepositoryImpl.fetchTeamMembers 等方法,验证真实 API、JSON 解析、映射流程。
3. CI 集成
- 阶段 1:CI 每次提交
flutter test --coverage,跑单元测试。 - 阶段 2:定时或手动触发少量集成测试,保证后端兼容。
- 阶段 3:可选 E2E/UI 测试,保证整个用户流畅。
七、工具 & 脚本
- CodeGen:
build_runner+json_serializable+(可选)dart_mappable - Mock:
mockito+build_runner - Lint & CI:确保
build_runner build无报错,所有测试覆盖率可观。