Flutter自动化生成等式插件autoequal_gen的使用
Flutter自动化生成等式插件autoequal_gen的使用
使用说明
autoequal_gen
是一个用于自动生成 List<Object?> _$props
私有扩展的 Dart 构建系统构建器,适用于带有 [@autoequal](/user/autoequal)
注解的类。
在你的 pubspec.yaml
文件中
- 将
autoequal
添加到dependencies
- 将
autoequal_gen
添加到dev_dependencies
- 将
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
更多关于Flutter自动化生成等式插件autoequal_gen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用autoequal_gen
插件来自动化生成等式(equals和hashCode方法)的代码案例。autoequal_gen
是一个Dart代码生成器,它通过注解自动生成equals
和hashCode
方法,以支持对象比较和哈希表操作。
首先,确保你的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
生成equals
和hashCode
方法的类。使用@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';
来声明一个将要由代码生成器生成的部分文件。
接下来,我们需要运行代码生成器来生成实际的equals
和hashCode
方法。在项目根目录下运行以下命令:
flutter pub run build_runner build
这个命令会扫描你的项目,查找所有使用@autoequal
注解的类,并在model.g.dart
文件中生成相应的equals
和hashCode
方法。
生成完成后,你可以在你的Flutter应用中使用Person
类,并且自动生成的equals
和hashCode
方法将支持对象比较和哈希表操作。例如:
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被认为是相等的
}
在这个示例中,person1
和person2
虽然是不同的对象实例,但由于它们的name
和age
属性相同,因此autoequal_gen
生成的equals
方法认为它们是相等的。这同样影响了它们在集合中的行为,如Set
中只会存储唯一的元素。
这就是如何在Flutter项目中使用autoequal_gen
插件来自动化生成等式方法的完整流程。希望这对你有所帮助!