swagger_generator_flutter/QUICK_REFERENCE.md

229 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Augment 代码生成快速参考
## 🚀 **快速开始**
### **生成 API 代码**
```bash
# 生成所有代码
dart run bin/main.dart generate --api --models --split-by-tags
# 只生成 API 接口
dart run bin/main.dart generate --api --split-by-tags
# 只生成数据模型
dart run bin/main.dart generate --models
```
### **项目集成**
```yaml
# pubspec.yaml
dependencies:
dio: ^5.0.0
retrofit: ^4.0.0
json_annotation: ^4.8.0
dev_dependencies:
build_runner: ^2.3.0
retrofit_generator: ^8.0.0
json_serializable: ^6.6.0
```
```bash
# 运行代码生成
dart pub get
dart pub run build_runner build
```
---
## 📋 **常见问题解决**
### **Q: 生成的类型不存在怎么办?**
```dart
// ❌ 错误:生成了不存在的类型
Future<BaseResult<TaskInfoResult>> someMethod();
// ✅ 解决:检查 swagger.json 中是否定义了 TaskInfoResult
// 如果没有定义,联系后端添加 schema 定义
// 或者使用通用类型:
Future<BaseResult<Map<String, dynamic>>> someMethod();
```
### **Q: 接口缺少参数怎么办?**
```dart
// ❌ 错误swagger 中没有定义参数,但生成器添加了
@POST('/api/v1/SomeAction')
Future<BaseResult<void>> someAction(
@Body() Map<String, dynamic> request // 不应该存在
);
// ✅ 解决:检查 swagger.json 中的参数定义
// 如果确实需要参数,联系后端在 swagger 中添加定义
```
### **Q: 可空性不正确怎么办?**
```dart
// ❌ 错误:字段应该可空但生成为非空
final String name; // 但实际可能为 null
// ✅ 解决:检查 swagger.json 中的 nullable 字段
{
"name": {
"type": "string",
"nullable": true // 添加这个字段
}
}
```
### **Q: 分页接口没有使用 BasePageResult**
```dart
// ❌ 错误:分页接口使用了错误的返回类型
Future<BaseResult<List<UserResult>>> getUserList();
// ✅ 解决:检查接口是否真的是分页接口
// 确保 swagger 中定义了分页相关的查询参数和响应结构
Future<BasePageResult<UserResult>> getUserList();
```
---
## 🔧 **调试技巧**
### **1. 检查 swagger.json**
```bash
# 验证 swagger.json 格式
curl -X POST "https://validator.swagger.io/validator/debug" \
-H "Content-Type: application/json" \
-d @swagger.json
```
### **2. 查看生成日志**
```bash
# 启用详细日志
dart run bin/main.dart generate --api --models --verbose
```
### **3. 手动验证类型**
```dart
// 在生成的代码中添加断言验证
assert(response.data is UserResult);
assert(response.data?.name != null);
```
---
## 📝 **代码模板**
### **标准 API 接口模板**
```dart
/// {接口描述}
@{HTTP_METHOD}('{路径}')
Future<{返回类型}> {方法名}(
// 路径参数(如果有)
@Path('{参数名}') {类型} 参数名,
// 查询参数(如果有)
@Query('{参数名}') {类型}? 参数名,
// 请求体(仅当 swagger 中明确定义时)
@Body() {类型} request
);
```
### **标准数据模型模板**
```dart
@JsonSerializable(checked: true, includeIfNull: false)
class {类名} {
/// {字段描述}
final {类型} {字段名};
const {类名}({
required this.{非空字段},
this.{可空字段},
});
factory {类名}.fromJson(Map<String, dynamic> json) =>
_${类名}FromJson(json);
Map<String, dynamic> toJson() => _${类名}ToJson(this);
}
```
---
## ⚡ **性能优化**
### **1. 按需导入**
```dart
// ✅ 只导入需要的类型
import 'package:learning_officer_oa/common/models/common/base_result.dart';
// ❌ 避免导入不需要的类型
// import 'package:learning_officer_oa/common/models/common/base_page_result.dart';
```
### **2. 使用 const 构造函数**
```dart
// ✅ 使用 const 构造函数
const UserResult({
required this.id,
required this.name,
});
// ❌ 避免非 const 构造函数
UserResult({
required this.id,
required this.name,
});
```
### **3. 合理的类型选择**
```dart
// ✅ 使用具体类型
Future<BaseResult<UserResult>> getUser();
// ❌ 避免过度使用 dynamic
Future<BaseResult<dynamic>> getUser();
```
---
## 🛡️ **安全检查**
### **生成前检查**
- [ ] swagger.json 格式正确
- [ ] 所有 $ref 引用存在
- [ ] 版本信息匹配
### **生成后检查**
- [ ] 代码通过 dart analyze
- [ ] 所有导入都存在
- [ ] 类型定义完整
- [ ] 可空性正确
### **部署前检查**
- [ ] 运行所有测试
- [ ] 代码格式化
- [ ] 文档更新
- [ ] 版本标记
---
## 📞 **获取帮助**
### **常见错误代码**
- **E001**: swagger.json 格式错误
- **E002**: 缺少必要的 schema 定义
- **E003**: $ref 引用不存在
- **E004**: 类型映射失败
### **联系方式**
- **技术支持**: 联系后端团队完善 swagger 文档
- **Bug 报告**: 提交到项目 Issues
- **功能请求**: 通过 PR 贡献代码
---
**快速参考版本**: v2.0
**最后更新**: 2025-01-24