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
确保你已经安装了最新版本的 flutter
和 dart
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
更多关于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_value
和built_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
中使用这些类了。