Flutter数据传输对象插件shelf_dto的使用

发布于 1周前 作者 itying888 来自 Flutter

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

1 回复

更多关于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 文件,其中包含 UserDtofromJsontoJson 方法的实现。

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_dtojson_serializable,你可以轻松地在 Dart/Flutter 项目中定义和使用 DTO。这不仅提高了代码的可读性和可维护性,还简化了与前后端之间的数据交换。

回到顶部