Flutter数据传输对象插件shelf_dto的使用
Flutter数据传输对象插件shelf_dto的使用
shelf_dto
是一个Dart库,灵感来源于NestJS的class-validator
。它旨在简化Dart应用程序中数据传输对象(DTO)的创建和验证。该库利用注解来在DTO类中直接定义和强制执行验证规则。
特性
- 声明式验证:使用注解指定验证规则。
- 易于集成:与现有的Dart项目简单集成。
- 代码生成:使用
build_runner
自动生成验证逻辑。
安装
要使用shelf_dto
,将其添加到你的pubspec.yaml
文件中:
dependencies:
shelf_dto: ^0.1.0
dev_dependencies:
build_runner: ^2.1.7
入门指南
步骤 1:定义你的DTO
在Dart文件中定义你的DTO,并导入必要的注解和异常处理类。使用[@DTO](/user/DTO)()
注解标记你的类为DTO,并在字段上添加验证注解。
import 'package:shelf_dto/shelf_dto.dart';
part 'user_dto.dto.dart';
[@DTO](/user/DTO)()
class UserDTO {
@IsString()
@IsNotEmpty()
final String? name;
@IsInt()
final int? age;
UserDTO._(this.name, this.age);
}
步骤 2:生成验证逻辑
运行build_runner
命令以生成验证逻辑:
dart run build_runner build
此命令会处理注解并生成用于验证DTO所需的代码。
使用示例
生成验证逻辑后,你可以自信地使用你的DTO,因为它将强制执行指定的验证规则。以下是如何使用UserDTO
类的示例:
import 'package:shelf_dto/shelf_dto.dart';
import 'dto/user_dto.dart';
void main() {
// 创建并初始化UserDTO实例
final userDTO = UserDTOValidator.fromMap({
'name': 'heron',
'age': 30,
});
try {
// 验证DTO
userDTO.validate();
// 获取验证后的值
String name = userDTO.name!;
int age = userDTO.age!;
print('Name: $name, Age: $age');
} on DTOException catch (e) {
// 处理验证错误
print(e.errors);
}
// 测试无效的数据
final userDTO2 = UserDTOValidator.fromMap({
'name': null,
'age': 30,
});
try {
// 验证DTO
userDTO2.validate();
} on DTOException catch (e) {
// 处理验证错误
print(e.errors);
}
}
注解
字段注解
@IsString(): 确保字段是一个字符串。
@IsNotEmpty(): 确保字段不是空的。
@IsInt(): 确保字段是一个整数。
类注解
[@DTO](/user/DTO)(): 标记类为数据传输对象,用于验证目的。
更多关于Flutter数据传输对象插件shelf_dto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据传输对象插件shelf_dto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,使用数据传输对象(DTO)是一种常见的实践,特别是在与后端进行通信时。shelf_dto
插件可以帮助你在 Dart 项目中方便地处理 DTO。虽然 shelf_dto
主要是为 shelf
服务器框架设计的,但它同样可以在 Flutter 项目中用于数据序列化与反序列化。
以下是一个简单的示例,展示了如何在 Dart/Flutter 项目中使用 shelf_dto
来定义和使用 DTO。
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 shelf_dto
依赖:
dependencies:
shelf_dto: ^x.y.z # 请替换为最新版本号
然后运行 flutter pub get
来获取依赖。
2. 定义 DTO 类
创建一个新的 Dart 文件(例如 models.dart
),并定义你的 DTO 类。使用 @JsonSerializable()
注解来标记类,这样 shelf_dto
(以及底层的 json_serializable
)就可以为你生成序列化代码。
import 'package:json_annotation/json_annotation.dart';
import 'package:shelf_dto/shelf_dto.dart';
part 'models.g.dart';
@JsonSerializable()
class UserDto extends Dto {
final String name;
final int age;
UserDto({required this.name, required this.age});
// 从 JSON 转换
factory UserDto.fromJson(Map<String, dynamic> json) => _$UserDtoFromJson(json);
// 转换为 JSON
Map<String, dynamic> toJson() => _$UserDtoToJson(this);
}
注意,这里使用了 Dto
类作为基类,这是 shelf_dto
提供的一个便利基类,但它不是强制性的。你可以直接使用 @JsonSerializable()
注解而不继承 Dto
。
3. 生成序列化代码
运行以下命令来生成序列化代码:
flutter pub run build_runner build
这将在你的项目目录中生成一个 models.g.dart
文件,其中包含 UserDto
的 fromJson
和 toJson
方法的实现。
4. 使用 DTO
现在你可以在你的代码中自由地使用 UserDto
类进行数据的序列化和反序列化了。例如,在 shelf
服务器中处理请求和响应:
import 'dart:convert';
import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'models.dart';
void main() {
var router = Router();
router.post('/users', (Request request) async {
// 从请求体中读取 JSON 数据
var body = await request.readAsString();
var userDto = UserDto.fromJson(jsonDecode(body) as Map<String, dynamic>);
// 处理数据(例如保存到数据库)
print('Received user: ${userDto.name}, ${userDto.age}');
// 返回响应
return Response.ok(jsonEncode(userDto.toJson()));
});
var handler = router.handler;
var server = await HttpServer.bind(InternetAddress.anyIPv4, 8080);
server.listen(handler);
print('Serving at http://${server.address.address}:${server.port}');
}
在这个例子中,我们创建了一个简单的 shelf
服务器,它监听 POST 请求到 /users
路径。请求体应该是一个 JSON 字符串,表示一个 UserDto
对象。服务器读取请求体,将其反序列化为 UserDto
对象,然后打印出来,并以 JSON 格式返回相同的对象。
总结
通过 shelf_dto
和 json_serializable
,你可以轻松地在 Dart/Flutter 项目中定义和使用 DTO。这不仅提高了代码的可读性和可维护性,还简化了与前后端之间的数据交换。