Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用

Flutter JSON序列化与依赖注入插件json_serializable_ioc_generator的使用

json_serializable_ioc_generator 是一个简化模型类 toJsonfromJson 方法注册的插件。它与 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

工作原理

  1. 模型注解:使用 json_annotation 包中的 [@JsonSerializable](/user/JsonSerializable) 注解标记模型类。这会触发生成 toJsonfromJson 方法。
  2. 注册注解:使用 [@RegisterJsonSerializable](/user/RegisterJsonSerializable) 注解标记负责依赖注入配置的方法(如 main())。这会生成 $registerJsonSerializableMethods() 函数。
  3. 代码生成:使用 build_runner 工具生成注册方法。
  4. 启动应用:调用生成的 $registerJsonSerializableMethods() 方法,将序列化方法注册到 JsonFactoryIocJsonConverterIoc 容器中。

基本用法

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) 注解,这将为该模型生成 fromJsontoJson 方法。


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() 函数。
  • 此函数将 toJsonfromJson 方法注册到 JsonFactoryIocJsonConverterIoc 容器中。
  • 使用 factory<T>() 动态反序列化 User 实例,使用 converter<T>() 将其序列化回 JSON。

API 参考

[@RegisterJsonSerializable](/user/RegisterJsonSerializable)

此注解用于标记负责依赖注入配置的方法(通常是 main() 方法)。它触发生成 $registerJsonSerializableMethods() 函数,该函数注册所有带有 [@JsonSerializable](/user/JsonSerializable) 注解的模型的 toJsonfromJson 方法。

生成的方法:$registerJsonSerializableMethods()

此方法由代码生成器生成,并将所有带有 [@JsonSerializable](/user/JsonSerializable) 注解的模型的 toJsonfromJson 方法注册到 JsonFactoryIocJsonConverterIoc 容器中。必须在运行时调用以正确注册。


示例代码

以下是完整的示例代码:

// 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

1 回复

更多关于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);
}
回到顶部