Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用
Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用
json_serializable_ioc_generator
是一个简化模型类 toJson
和 fromJson
方法注册的插件。它与 json_serializable_ioc
配合使用,能够自动生成这些方法的注册代码。
特性
- 自动方法注册:自动生成代码以注册模型的工厂方法和转换器方法。
- 利用
[@JsonSerializable](/user/JsonSerializable)
:使用json_annotation
包进行模型序列化。 - 自定义启动注解:将
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)
注解应用于负责应用程序配置的方法(如main()
),触发生成$registerJsonSerializableMethods()
方法。 - 生成的注册方法:生成一个
$registerJsonSerializableMethods()
函数,用于在运行时注册序列化方法。
安装
在 pubspec.yaml
文件中添加以下依赖项:
dependencies:
json_annotation: ^4.7.0
json_serializable_ioc: ^1.0.0
dev_dependencies:
build_runner: ^2.1.0
json_serializable_ioc_generator: ^1.0.0
然后运行以下命令以获取依赖项:
flutter pub get
工作原理
- 模型注解:使用
json_annotation
包中的[@JsonSerializable](/user/JsonSerializable)
注解标记模型类。这会触发生成toJson
和fromJson
方法。 - 注册注解:使用
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)
注解标记负责依赖注入配置的方法(如main()
)。这会生成$registerJsonSerializableMethods()
函数。 - 代码生成:使用
build_runner
工具生成注册方法。 - 启动应用:调用生成的
$registerJsonSerializableMethods()
方法,将序列化方法注册到JsonFactoryIoc
和JsonConverterIoc
容器中。
基本用法
1. 注解你的模型
// user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart'; // 自动生成的文件
[@JsonSerializable](/user/JsonSerializable)()
class User {
final int id;
final String name;
User({required this.id, required this.name});
// 自动生成的工厂方法
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
// 自动生成的序列化方法
Map<String, dynamic> toJson() => _$UserToJson(this);
}
在此示例中,User
模型使用了 [@JsonSerializable](/user/JsonSerializable)
注解,这将为该模型生成 fromJson
和 toJson
方法。
2. 代码生成
运行以下命令以触发代码生成:
flutter pub run build_runner build
这将生成 $registerJsonSerializableMethods()
函数,该函数会自动注册工厂和转换器方法。
3. 注册序列化方法
在 main.dart
或其他启动方法中,使用 [@RegisterJsonSerializable](/user/RegisterJsonSerializable)
注解标记方法以触发代码生成。生成后,调用生成的 $registerJsonSerializableMethods()
函数。
// main.dart
import 'dart:convert';
import 'package:json_ioc_example/user.dart';
import 'package:json_ioc_example/main.json_ioc.dart';
import 'package:json_serializable_ioc/json_serializable_ioc.dart';
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)() // 触发生成 $registerJsonSerializableMethods()
void main(List<String> arguments) {
// 注册所有注解模型的方法
$registerJsonSerializableMethods();
// 从 JSON 反序列化 User 对象
User user = factory<User>({
"id": 55,
"name": "potatoes",
});
// 将 User 对象序列化回 JSON
print(jsonEncode(converter<User>(user))); // 输出: {"id":55,"name":"potatoes"}
}
解释:
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)
注解被用于main()
方法,这将生成$registerJsonSerializableMethods()
函数。- 此函数将
toJson
和fromJson
方法注册到JsonFactoryIoc
和JsonConverterIoc
容器中。 - 使用
factory<T>()
动态反序列化User
实例,使用converter<T>()
将其序列化回 JSON。
API 参考
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)
此注解用于标记负责依赖注入配置的方法(通常是 main()
方法)。它触发生成 $registerJsonSerializableMethods()
函数,该函数注册所有带有 [@JsonSerializable](/user/JsonSerializable)
注解的模型的 toJson
和 fromJson
方法。
生成的方法:$registerJsonSerializableMethods()
此方法由代码生成器生成,并将所有带有 [@JsonSerializable](/user/JsonSerializable)
注解的模型的 toJson
和 fromJson
方法注册到 JsonFactoryIoc
和 JsonConverterIoc
容器中。必须在运行时调用以正确注册。
示例代码
以下是完整的示例代码:
// user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
[@JsonSerializable](/user/JsonSerializable)()
class User {
final int id;
final String name;
User({required this.id, required this.name});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
// main.dart
import 'dart:convert';
import 'package:json_ioc_example/user.dart';
import 'package:json_ioc_example/main.json_ioc.dart';
import 'package:json_serializable_ioc/json_serializable_ioc.dart';
[@RegisterJsonSerializable](/user/RegisterJsonSerializable)()
void main(List<String> arguments) {
// 注册所有注解模型的方法
$registerJsonSerializableMethods();
// 从 JSON 反序列化 User 对象
User user = factory<User>({
"id": 55,
"name": "potatoes",
});
// 将 User 对象序列化回 JSON
print(jsonEncode(converter<User>(user))); // 输出: {"id":55,"name":"potatoes"}
}
更多关于Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,json_serializable
是一个常用的代码生成库,用于自动生成JSON序列化和反序列化的代码。而 json_serializable_ioc_generator
是一个基于 json_serializable
的扩展插件,它结合了依赖注入(IoC)的功能,使得在生成JSON序列化代码的同时,也能够生成依赖注入相关的代码。
1. 安装依赖
首先,你需要在 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
json_annotation: ^4.8.0
dev_dependencies:
build_runner: ^2.3.3
json_serializable: ^6.6.0
json_serializable_ioc_generator: ^1.0.0
2. 创建模型类
接下来,创建一个模型类,并使用 [@JsonSerializable](/user/JsonSerializable)
和 [@JsonSerializableIoC](/user/JsonSerializableIoC)
注解来标记它。例如:
import 'package:json_annotation/json_annotation.dart';
import 'package:json_serializable_ioc_generator/json_serializable_ioc_generator.dart';
part 'user.g.dart';
[@JsonSerializable](/user/JsonSerializable)()
[@JsonSerializableIoC](/user/JsonSerializableIoC)()
class User {
final String name;
final int age;
User({required this.name, required this.age});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
3. 生成代码
运行以下命令来生成代码:
flutter pub run build_runner build
这将生成 user.g.dart
文件,其中包含 User
类的序列化和反序列化代码,以及依赖注入相关的代码。
4. 使用生成的代码
生成的代码将包含一个 UserIoC
类,你可以使用它来进行依赖注入。例如:
import 'user.dart';
void main() {
final user = UserIoC.fromJson({'name': 'John', 'age': 30});
print(user.name); // 输出: John
print(user.age); // 输出: 30
}
5. 依赖注入
json_serializable_ioc_generator
还支持依赖注入。你可以在模型类中使用 [@Inject](/user/Inject)
注解来标记需要注入的依赖。例如:
import 'package:json_annotation/json_annotation.dart';
import 'package:json_serializable_ioc_generator/json_serializable_ioc_generator.dart';
part 'user.g.dart';
[@JsonSerializable](/user/JsonSerializable)()
[@JsonSerializableIoC](/user/JsonSerializableIoC)()
class User {
final String name;
final int age;
[@Inject](/user/Inject)()
final SomeService service;
User({required this.name, required this.age, required this.service});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}