Flutter数据类生成插件dataclass的使用
Flutter数据类生成插件dataclass的使用
欢迎使用Freezed的宏版本!这个工具已经重命名为dataclass
,以便用户可以同时使用build_runner
和宏。
这是一个工具,它会自动生成toString
、copyWith
(包括copyWith(field: null)
)、hashCode
、==
等方法。
请注意,这是关于当宏在Dart中落地时Freezed会是什么样子的一个非常早期的概念验证。由于许多宏特性缺失,很多Freezed特性都缺失或损坏。请自行承担风险使用 :)
安装
要开始使用Freezed的宏版本:
- 确保你使用的Dart版本 >= 3.5.0-dev
- 在你的
analysis_options.yaml
中启用macros
如下所示:# analysis_options.yaml analyzer: enable-experiment: - macros
- 安装Freezed >= 3.0.0:
name: your_app environment: sdk: ">=3.5.0-0.0-dev <4.0.0" dependencies: # Freezed现在是一个"dependencies"。 # freezed_annotation不再需要 dataclass: ^3.0.0-0.0.dev
使用
支持两种可能的语法:
- 构造函数优先。你定义一个带有构造函数的类,而宏会为你生成字段。这让你对位置参数与命名参数有精细控制。它可以使用断言、
super
等。虽然宏还有很多与此相关的问题尚未解决。所以尽管语法非常灵活,但很多东西还不支持。 - 字段优先。你定义一个带有字段的类,而宏会为你生成构造函数。这是最稳定的语法,但它不太灵活,也不太符合Dart风格。如果你想要完全控制构造函数,则必须使用构造函数优先的语法。
构造函数优先用法
要使用构造函数优先的语法,定义一个带有构造函数但没有字段的类:
[@Data](/user/Data)()
class Example {
Example({required int foo, required String bar});
}
宏会为你生成字段以及各种方法。
void main() {
final example = Example(foo: 42, bar: '42');
print(example.foo); // 42
}
使用命名构造函数
当然,宏期望你使用默认构造函数。如果你想根据命名构造函数生成字段,请指定[@Data](/user/Data)(constructor: '<constructor name>')
。
[@Data](/user/Data)(constructor: 'custom')
class Example {
Example.custom({required int foo, required String bar});
}
字段优先用法
要使用字段优先的语法,定义一个带有字段但默认构造函数的类。宏会为你生成构造函数以及各种方法。
[@Data](/user/Data)()
class Example {
final int foo;
final String bar;
}
目前,所有字段都是“命名”参数,并且如果它们是可空的,则是可选的。
void main() {
final example = Example(foo: 42, bar: '42');
print(example.foo); // 42
}
指定构造函数名称
如果你想生成非默认构造函数,可以指定[@Data](/user/Data)(constructor: '<constructor name>')
。
[@Data](/user/Data)(constructor: 'custom')
class Example {
final int foo;
}
void main() {
final example = Example.custom(foo: 42);
}
特性
特性 | 状态 | 注释 |
---|---|---|
copyWith | ✅ | |
toString | ✅ | |
==/hashCode | ✅ | |
unions | 🚧 | 虽然支持,但宏在类继承方面有点问题。 |
json支持 | 🚧 | |
默认值 | ❌ | 需要宏进一步发展 |
深拷贝 | ❌ | 需要宏进一步发展 |
泛型类 | ❌ | 需要宏进一步发展 |
示例代码
// ignore_for_file: avoid_unused_constructor_parameters
import 'package:dataclass/dataclass.dart';
// 常规语法,基于构造函数。
// 我们不再使用"factory"构造函数。
[@Data](/user/Data)()
class Person {
Person(
String name, {
required int age,
});
}
// 另外,你可以通过字段定义类:
[@Data](/user/Data)()
class Person2 {
final String name;
final int age;
}
void main() {
var person = Person('John', age: 30);
person = person.copyWith(age: 31);
print(person.name); // John
print(person.age); // 31
// Person2的工作方式相同!
var person2 = Person2(name: 'John', age: 30);
person2 = person2.copyWith(age: 31);
}
// ---- 高级用法:联合 ----
class Engine {}
[@Data](/user/Data)()
sealed class Vehicle {
final Engine engine;
}
[@Data](/user/Data)()
class Plane implements Vehicle {
final Wing wing;
// 目前由于增强库尚未完全实现,这是必要的。
// 这在未来将不需要。
[@override](/user/override)
final Engine engine;
}
class Wing {}
[@Data](/user/Data)()
class Car implements Vehicle {
final Wheel wheel;
[@override](/user/override)
final Engine engine;
}
class Wheel {}
更多关于Flutter数据类生成插件dataclass的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据类生成插件dataclass的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用dataclass
插件来生成数据类的详细步骤和代码示例。dataclass
插件可以帮助你快速生成数据类(通常称为Model或DTO),并且通常会自动生成诸如fromJson
和toJson
这样的方法,以便于序列化和反序列化。
1. 添加依赖
首先,你需要在你的pubspec.yaml
文件中添加dataclass
插件的依赖。
dependencies:
flutter:
sdk: flutter
dataclass: ^1.0.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
2. 使用dataclass生成数据类
假设你有一个用户数据模型,包含id
、name
和email
字段。你可以使用dataclass
插件的注解来生成这个数据类。
2.1 创建数据类文件
在lib
目录下创建一个新的文件,比如user_model.dart
。
import 'package:dataclass/dataclass.dart';
part 'user_model.g.dart';
@DataClass()
class User {
final int id;
final String name;
final String email;
// DataClass生成器会为你生成构造函数、fromJson、toJson等方法
// 因此你不需要手动编写这些方法
}
2.2 生成代码
接下来,你需要运行生成代码的命令。确保你已经安装了Dart的build_runner
工具。如果没有安装,可以通过以下命令安装:
dart pub global activate build_runner
然后,在项目根目录下运行以下命令来生成数据类的辅助代码:
flutter pub run build_runner build --build-target=dataclass:generate
这将在user_model.g.dart
文件中生成所需的代码。
3. 使用生成的数据类
现在,你可以在你的Flutter项目中使用这个生成的数据类。例如,你可以从JSON字符串中反序列化一个User
对象,或者将一个User
对象序列化为JSON字符串。
void main() {
// 示例JSON字符串
String userJson = '{"id": 1, "name": "John Doe", "email": "john.doe@example.com"}';
// 从JSON字符串反序列化User对象
User user = User.fromJson(userJson);
// 打印User对象的属性
print('ID: ${user.id}, Name: ${user.name}, Email: ${user.email}');
// 将User对象序列化为JSON字符串
String jsonString = user.toJson();
print('Serialized JSON: $jsonString');
}
注意事项
- 确保你的
dataclass
版本是最新的,因为不同版本的插件可能会有一些API变化。 - 在运行生成代码的命令时,确保你在项目的根目录下。
- 如果你的数据类有多个文件或者更复杂的结构,可能需要调整
build_runner
的配置。
通过以上步骤,你应该能够在Flutter项目中成功使用dataclass
插件来生成和管理数据类。