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

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

简介

built_value 提供了不可变值类型、枚举类(EnumClass)和JSON序列化功能,帮助开发者更方便地处理数据模型。配合 built_value_generator 插件,可以自动生成大量模板代码,减少手写重复代码的工作量。以下将详细介绍如何在Flutter项目中使用 built_value_generator

安装与配置

首先,在项目的 pubspec.yaml 文件中添加必要的依赖:

dependencies:
  built_value: ^8.3.0
  built_collection: ^5.1.1

dev_dependencies:
  build_runner: ^2.1.7
  built_value_generator: ^8.3.0

确保你已经安装了最新版本的 flutterdart SDK,并且你的开发环境支持 build_runner

创建数据类

接下来,创建一个简单的 Person 数据类作为示例。按照下面步骤操作:

步骤1:定义数据类结构

lib/models/person.dart 中编写如下代码:

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:built_collection/built_collection.dart';

part 'person.g.dart'; // 自动生成的部分

abstract class Person implements Built<Person, PersonBuilder> {
  static Serializer<Person> get serializer => _$personSerializer;

  int get id;
  
  @nullable
  int get age;

  @nullable
  @BuiltValueField(wireName: 'first_name')
  String get firstName;

  @nullable
  BuiltList<String> get hobbies;

  Person._();
  factory Person([void Function(PersonBuilder) updates]) = _$Person;
}

注意:

  • @nullable 表示该字段允许为 null
  • @BuiltValueField(wireName: 'first_name') 指定 JSON 中对应的键名
  • part 'person.g.dart' 声明了一个部分文件,用于存放生成的代码

步骤2:生成代码

运行命令来生成 .g.dart 文件:

flutter packages pub run build_runner build

或者如果你希望持续监听文件变化并自动更新生成的代码,可以使用:

flutter packages pub run build_runner watch

此时,你应该会在同一目录下看到新生成的 person.g.dart 文件,里面包含了所有你需要的方法实现。

使用数据类

现在可以在应用程序中使用这个 Person 类了。例如:

void main() {
  final person = Person((b) => b
    ..id = 12345
    ..age = 35
    ..firstName = "Jimmy"
    ..hobbies.add("jumping")
    ..hobbies.add("basketball"));

  print(person);
}

这行代码会输出类似如下的内容:

Person{id: 12345, age: 35, first_name: Jimmy, hobbies: [jumping, basketball]}

此外,还可以轻松地将其转换为 JSON 字符串或从 JSON 解析回对象:

// 序列化为 JSON
final json = serializers.serializeWith(Person.serializer, person);

// 反序列化为对象
final newPerson = serializers.deserializeWith(Person.serializer, json);

以上就是 built_value_generator 在 Flutter 项目中的基本用法。通过这种方式,你可以快速构建复杂的数据模型,并享受其带来的诸多优势,比如更好的性能、更高的安全性以及更清晰的代码逻辑。

如果你想要了解更多高级特性和最佳实践,请参考官方文档和相关教程链接。


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

1 回复

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


当然,以下是如何在Flutter项目中使用built_value_generator插件来生成数据类的示例。built_value是一个强大的Dart库,用于创建不可变且值相等的对象,而built_value_generator则是用于生成这些类的代码生成器。

步骤 1: 添加依赖项

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

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.1.3  # 请检查最新版本

dev_dependencies:
  build_runner: ^2.1.4  # 请检查最新版本
  built_value_generator: ^8.1.3  # 与built_value相同版本

步骤 2: 创建数据类

接下来,你需要定义一个抽象的数据类,并使用@BuiltValue注解进行标记。

import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';

abstract class User implements Built<User, UserBuilder> {
  // 定义字段
  String get name();
  int get age();
  BuiltList<String> get hobbies();

  // 定义工厂构造函数
  User._();

  // 创建Builder的工厂方法
  factory User([updates(UserBuilder b)]) = _$User;

  // 自定义相等性判断(可选)
  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    if (other is! User) return false;
    return other.name == name && other.age == age && other.hobbies == hobbies;
  }

  int get hashCode {
    return Object.hash(name, age, hobbies);
  }

  // 自定义字符串表示(可选)
  String toString() {
    return 'User { name: $name, age: $age, hobbies: $hobbies }';
  }
}

步骤 3: 创建Builder类

built_value会自动为你生成一个UserBuilder类,用于构建User对象。你可以使用UserBuilder来设置字段值并构建User对象。

void main() {
  // 使用UserBuilder构建User对象
  User user = UserBuilder()
      .name('Alice')
      .age(30)
      .hobbies(['Reading', 'Hiking', 'Gaming'])
      .build();

  // 打印User对象
  print(user);
}

步骤 4: 运行代码生成器

为了生成User类和UserBuilder类的实现代码,你需要运行build_runner命令:

flutter pub run build_runner build

这将生成_$User_$UserBuilder类,并放在项目的generated目录下(如果没有这个目录,它会自动创建)。

完整示例

以下是一个完整的示例,包括依赖项、数据类和主函数:

# pubspec.yaml
name: my_app
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.1.3

dev_dependencies:
  build_runner: ^2.1.4
  built_value_generator: ^8.1.3

flutter:
  uses-material-design: true
// main.dart
import 'package:flutter/material.dart';
import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';

part 'main.g.dart';

abstract class User implements Built<User, UserBuilder> {
  String get name();
  int get age();
  BuiltList<String> get hobbies();

  User._();
  factory User([updates(UserBuilder b)]) = _$User;

  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    if (other is! User) return false;
    return other.name == name && other.age == age && other.hobbies == hobbies;
  }

  int get hashCode {
    return Object.hash(name, age, hobbies);
  }

  String toString() {
    return 'User { name: $name, age: $age, hobbies: $hobbies }';
  }
}

void main() {
  // 运行代码生成器后,以下代码将有效
  User user = UserBuilder()
      .name('Alice')
      .age(30)
      .hobbies(['Reading', 'Hiking', 'Gaming'])
      .build();

  print(user);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo Home Page'),
        ),
        body: Center(
          child: Text('Hello, Flutter!'),
        ),
      ),
    );
  }
}

运行flutter pub run build_runner build后,main.g.dart文件将被生成,其中包含了_$User_$UserBuilder的实现。然后你就可以在main.dart中使用这些类了。

回到顶部