Flutter实体生成插件squarealfa_entity_generator的使用

Flutter实体生成插件squarealfa_entity_generator的使用

获取开始

验证

首先,在你想要生成验证代码的PODO(Plain Old Dart Object)类上添加@validatable注解:

/// 确保库中包含part语句。
part 'recipe.g.dart';

@validatable
class Recipe {

    final String title;

    const Recipe({required this.title});
}

这将生成一个Validator类,其中包含每个属性的验证方法。默认情况下,每个验证方法会返回null,例如:

/// 这是一个生成的验证器类的示例。
class RecipeValidator implements Validator {
  const RecipeValidator();

  ValidationError? validateTitle(String value) {
    return null;
  }

  @override
  ErrorList validate(covariant Recipe entity) {
    var errors = <ValidationError>[];
    ValidationError? error;
    if ((error = validateTitle(entity.title)) != null) {
      errors.add(error!);
    }

    return ErrorList(errors);
  }

  @override
  void validateThrowing(covariant Recipe entity) {
    var errors = validate(entity);
    if (errors.validationErrors.isNotEmpty) throw errors;
  }
}

为每个字段添加规则注解,以应用于该字段:

/// 确保库中包含part语句。
part 'ingredient.g.dart';

@validatable
class Ingredient {

  @StringLength(minLength: 10)
  final String description;

  @StringLength(maxLength: 10)
  final String? notes;

  @StringLength(minLength: 2)
  final String? tag;

  @DoubleRange(minValue: 10, maxValue: 20)
  final double quantity;

  @Range(minValue: 10)
  final Decimal precision;

  @Range(minValue: 10, maxValue: 20)
  final int intQuantity;

  @Range(minValue: 10, maxValue: 20)
  final int? nintQuantity;

  @Range(minValue: 10, maxValue: 20)
  @required
  final int? rInt;

  Ingredient({
    required this.description,
    required this.quantity,
    required this.precision,
    required this.intQuantity,
    this.notes,
    this.tag,
    this.nintQuantity,
    this.rInt,
  });
}
构建器

PODO类上添加@builder注解以生成非不可变构建器类:

/// 确保库中包含part语句。
part 'recipe.g.dart';

@builder
class Recipe {
  final String title;

  final String? description;
  
  Recipe({
    required this.title,
    this.description,
  });
}

这将生成一个构建器类:

class RecipeBuilder implements Builder<Recipe> {
  String title;
  String? description;

  RecipeBuilder({
    required this.title,
    this.description,
  });

  factory RecipeBuilder.fromRecipe(Recipe entity) {
    return RecipeBuilder(
      title: entity.title,
      description: entity.description,
    );
  }

  @override
  Recipe build() {
    var entity = Recipe(
      title: title,
      description: description,
    );
    RecipeValidator().validateThrowing(entity);
    return entity;
  }
}
copyWith

PODO类上添加@copyWith注解以生成包含copyWith方法的扩展:

/// 确保库中包含part语句。
part 'recipe.g.dart';

@copyWith
class Recipe {
  final String title;

  final String? description;
  
  Recipe({
    required this.title,
    this.description,
  });
}

这将生成一个扩展,该扩展添加了copyWith方法:

extension RecipeCopyWithExtension on Recipe {
  Recipe copyWith({
    String? title,
    String? description,
    bool setDescriptionToNull = false,
  }) {
    return Recipe(
      title: title ?? this.title,
      description:
          setDescriptionToNull ? null : description ?? this.description,
    );
  }
}

更多关于Flutter实体生成插件squarealfa_entity_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实体生成插件squarealfa_entity_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


squarealfa_entity_generator 是一个用于 Flutter 的代码生成插件,它可以帮助开发者自动生成 Dart 实体类。这个插件通常与 json_serializable 或其他类似的库一起使用,以简化从 JSON 数据到 Dart 实体类的转换过程。

使用步骤

  1. 添加依赖

    首先,在 pubspec.yaml 文件中添加 squarealfa_entity_generatorbuild_runner 作为开发依赖。

    dev_dependencies:
      squarealfa_entity_generator: ^version
      build_runner: ^version
    

    请将 ^version 替换为最新的版本号。

  2. 创建实体类

    创建一个 Dart 类,并使用 [@Entity](/user/Entity) 注解标记它。这个类将作为生成的实体类的模板。

    import 'package:squarealfa_entity_generator/squarealfa_entity_generator.dart';
    
    [@Entity](/user/Entity)()
    class User {
      final String name;
      final int age;
    
      User({required this.name, required this.age});
    }
    
  3. 运行代码生成器

    在终端中运行以下命令来生成实体类代码:

    flutter pub run build_runner build
    

    这将根据你的模板类生成一个新的 Dart 文件,通常命名为 *.g.dart,其中包含实体类的实现。

  4. 使用生成的实体类

    在你的代码中,你可以直接使用生成的实体类。例如:

    import 'user.g.dart';
    
    void main() {
      var user = User(name: 'John Doe', age: 30);
      print(user.toJson()); // 将对象转换为 JSON
    }
    

高级用法

  • 自定义字段映射

    你可以使用 @JsonKey 注解来自定义字段的 JSON 映射。例如:

    [@Entity](/user/Entity)()
    class User {
      @JsonKey(name: 'full_name')
      final String name;
    
      final int age;
    
      User({required this.name, required this.age});
    }
    
  • 嵌套实体

    如果你的实体类包含其他实体类,squarealfa_entity_generator 也可以处理嵌套实体。

    [@Entity](/user/Entity)()
    class Address {
      final String city;
      final String street;
    
      Address({required this.city, required this.street});
    }
    
    [@Entity](/user/Entity)()
    class User {
      final String name;
      final int age;
      final Address address;
    
      User({required this.name, required this.age, required this.address});
    }
回到顶部