Flutter数据类生成插件dataclass的使用

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

Flutter数据类生成插件dataclass的使用

欢迎使用Freezed的宏版本!这个工具已经重命名为dataclass,以便用户可以同时使用build_runner和宏。

这是一个工具,它会自动生成toStringcopyWith(包括copyWith(field: null))、hashCode==等方法。

请注意,这是关于当宏在Dart中落地时Freezed会是什么样子的一个非常早期的概念验证。由于许多宏特性缺失,很多Freezed特性都缺失或损坏。请自行承担风险使用 :)

安装

要开始使用Freezed的宏版本:

  1. 确保你使用的Dart版本 >= 3.5.0-dev
  2. 在你的analysis_options.yaml中启用macros如下所示:
    # analysis_options.yaml
    analyzer:
      enable-experiment:
        - macros
    
  3. 安装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
    

使用

支持两种可能的语法:

  1. 构造函数优先。你定义一个带有构造函数的类,而宏会为你生成字段。这让你对位置参数与命名参数有精细控制。它可以使用断言、super等。虽然宏还有很多与此相关的问题尚未解决。所以尽管语法非常灵活,但很多东西还不支持。
  2. 字段优先。你定义一个带有字段的类,而宏会为你生成构造函数。这是最稳定的语法,但它不太灵活,也不太符合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

1 回复

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


当然,以下是如何在Flutter项目中使用dataclass插件来生成数据类的详细步骤和代码示例。dataclass插件可以帮助你快速生成数据类(通常称为Model或DTO),并且通常会自动生成诸如fromJsontoJson这样的方法,以便于序列化和反序列化。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加dataclass插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  dataclass: ^1.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 使用dataclass生成数据类

假设你有一个用户数据模型,包含idnameemail字段。你可以使用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插件来生成和管理数据类。

回到顶部