Flutter自动化生成等式插件autoequal_gen的使用

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

Flutter自动化生成等式插件autoequal_gen的使用

使用说明

autoequal_gen 是一个用于自动生成 List<Object?> _$props 私有扩展的 Dart 构建系统构建器,适用于带有 [@autoequal](/user/autoequal) 注解的类。

在你的 pubspec.yaml 文件中

  1. autoequal 添加到 dependencies
  2. autoequal_gen 添加到 dev_dependencies
  3. build_runner 添加到 dev_dependencies

示例配置如下:

dependencies:
  autoequal: ^最新版本号
  equatable: ^最新版本号

dev_dependencies:
  autoequal_gen: ^最新版本号
  build_runner: ^最新版本号

使用 [@autoequal](/user/autoequal) 注解标注你的类

以下是一个完整的示例 demo:

import 'package:autoequal/autoequal.dart';
import 'package:equatable/equatable.dart';

// 自动生成的文件需要声明在这里
part 'some_class.g.dart';

// 使用 [@autoequal](/user/autoequal) 注解
[@autoequal](/user/autoequal)
class SomeClass extends Equatable {
  const SomeClass({this.id, this.random});

  final String id;
  final String? random; // 可以被忽略的字段

  // 使用生成的 _$props
  [@override](/user/override)
  List<Object?> get props => _$props;
}

确保在文件顶部包含 part 'your_file_name.g.dart'; 声明。

启动代码生成

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

flutter pub run build_runner build

生成的扩展代码

生成的代码将会如下所示:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'some_class.dart';

// **************************************************************************
// AutoequalGenerator
// **************************************************************************

extension _$SomeClassAutoequal on SomeClass {
  List<Object> get _$props => [id]; // 自动生成的属性列表
}

自动包含注解

[@autoequal](/user/autoequal) 注解足够智能,可以为使用 Equatable 的类自动生成 props getter,而无需显式注解。

更新你的 build.yaml 文件:

targets:
  $default:
    builders:
      autoequal_gen:
        enabled: true
        options:
          auto_include: true
          exclude:
            - SomeClass # 类名的正则表达式模式

或者添加正则表达式模式到 include 选项:

targets:
  $default:
    builders:
      autoequal_gen:
        enabled: true
        options:
          include:
            - SomeClass # 类名的正则表达式模式

然后正常使用 Equatable 并创建 props getter:

class SomeClass with EquatableMixin { // 或者 `extends Equatable`
  const SomeClass({this.id});

  final String id;

  [@override](/user/override)
  List<Object?> get props => _$props;
}

注意:如果未定义 props getter,则 autoequal 不会生成 _$props 变量。

继承

如果你的类继承了另一个使用 Equatable 的类,你可以使用 [@autoequal](/user/autoequal) 注解,autoequal 会自动处理:

[@autoequal](/user/autoequal)
class SubClass extends BaseClass { // BaseClass extends Equatable
  const SubClass({required this.name, required super.id});

  final String name;

  [@override](/user/override)
  List<Object?> get props => _$props;
}

// 生成的代码
extension _$SubClassAutoequal on SubClass {
  List<Object?> get _$props => [name, id];
}

字段/Getter 注解

忽略字段或 Getter 方法

可以通过使用 [@ignore](/user/ignore) 注解来忽略字段或 Getter 方法:

[@ignore](/user/ignore)
final int random;
包含字段或 Getter 方法

可以通过使用 @include 注解来包含字段或 Getter 方法:

@include
String get id => _id;

build.yaml 配置选项

默认情况下,构建器会忽略所有 props 中的 Getter 方法,但你可以在 build.yaml 文件中更改此行为:

targets:
  $default:
    builders:
      autoequal_gen:
        enabled: true
        options:
          ... # 查看下面的选项

查看源代码获取完整的选项列表。所有选项都是可选的,所有选项键均采用 snake_case 格式。

完整示例 Demo

import 'package:autoequal/autoequal.dart';
import 'package:equatable/equatable.dart';

part 'main.g.dart';

[@autoequal](/user/autoequal)
class Example1Class extends Equatable {
  Example1Class({
    required this.value,
    this.ignored,
    this.optional,
  });

  final String value;
  final String? optional;

  [@ignore](/user/ignore)
  final String? ignored;

  [@override](/user/override)
  List<Object?> get props => _$props;
}

[@autoequal](/user/autoequal)
class Example2Class with EquatableMixin {
  const Example2Class({
    required this.value,
    this.ignored,
    this.optional,
  });

  final String value;
  final String? optional;

  [@ignore](/user/ignore)
  final String? ignored;

  [@override](/user/override)
  List<Object?> get props => _$props;
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用autoequal_gen插件来自动化生成等式(equals和hashCode方法)的代码案例。autoequal_gen是一个Dart代码生成器,它通过注解自动生成equalshashCode方法,以支持对象比较和哈希表操作。

首先,确保你的Flutter项目已经配置好对autoequal_gen的依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  build_runner: ^2.1.4
  autoequal_gen: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来获取依赖。

接下来,创建一个Dart文件,例如model.dart,并在其中定义一个需要使用autoequal_gen生成equalshashCode方法的类。使用@autoequal注解来标记这个类:

import 'package:autoequal_gen/autoequal_gen.dart';

part 'model.g.dart'; // 这将是由代码生成器生成的文件的导入

@autoequal
class Person {
  final String name;
  final int age;

  Person({required this.name, required this.age});
}

注意,model.dart文件中我们使用part 'model.g.dart';来声明一个将要由代码生成器生成的部分文件。

接下来,我们需要运行代码生成器来生成实际的equalshashCode方法。在项目根目录下运行以下命令:

flutter pub run build_runner build

这个命令会扫描你的项目,查找所有使用@autoequal注解的类,并在model.g.dart文件中生成相应的equalshashCode方法。

生成完成后,你可以在你的Flutter应用中使用Person类,并且自动生成的equalshashCode方法将支持对象比较和哈希表操作。例如:

void main() {
  var person1 = Person(name: 'Alice', age: 30);
  var person2 = Person(name: 'Alice', age: 30);
  var person3 = Person(name: 'Bob', age: 25);

  print(person1 == person2); // 输出: true
  print(person1 == person3); // 输出: false

  var set = <Person>{};
  set.add(person1);
  set.add(person2);
  set.add(person3);

  print(set.length); // 输出: 2,因为person1和person2被认为是相等的
}

在这个示例中,person1person2虽然是不同的对象实例,但由于它们的nameage属性相同,因此autoequal_gen生成的equals方法认为它们是相等的。这同样影响了它们在集合中的行为,如Set中只会存储唯一的元素。

这就是如何在Flutter项目中使用autoequal_gen插件来自动化生成等式方法的完整流程。希望这对你有所帮助!

回到顶部