Flutter数据转换插件flutterfire_json_converters的使用

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

Flutter数据转换插件flutterfire_json_converters的使用

flutterfire_json_converters 是一个用于FlutterFire应用的JSON转换插件,支持与 json_serializablefreezed 结合使用。它提供了一些有用的JSON转换器,特别是在处理Cloud Firestore的时间戳字段时非常有用。

如何使用

要求

该包使用了Dart 3的一些特性,因此需要兼容的Dart(Flutter)SDK版本:

environment:
  sdk: '>=3.0.0 <4.0.0'
  flutter: '>=3.10.0'

安装

为了在项目中使用 flutterfire_json_converters,你需要安装以下依赖包:

使用 build_runner 进行代码生成:

flutter pub add --dev build_runner

如果你使用 freezed

flutter pub add freezed_annotation
flutter pub add --dev freezed

如果你使用 json_serializable

flutter pub add json_serializable
flutter pub add json_annotation
flutter pub add --dev json_serializable

示例:sealedTimestampConverter

当处理Cloud Firestore的 Timestamp 字段时,可能会遇到以下几种情况:

  • 希望将字段作为Dart的 DateTime 类型进行操作。
  • 在创建或更新Cloud Firestore文档时,希望某些字段(例如 updatedAt)自动设置为 FieldValue.serverTimestamp()
  • 对于其他字段(例如 createdAt),有时希望指定客户端的 DateTime 并将其保存到Cloud Firestore文档中,而有时则希望自动设置为 FieldValue.serverTimestamp()

针对这些情况,可以定义 DateTime/Timestamp 字段为 SealedTimestamp 类型,并使用 [@sealedTimestampConverter](/user/sealedTimestampConverter)[@alwaysUseServerTimestampSealedTimestampConverter](/user/alwaysUseServerTimestampSealedTimestampConverter) 注解:

import 'package:flutterfire_json_converters/flutterfire_json_converters.dart';
import 'package:json_annotation/json_annotation.dart';

part 'main.g.dart';

[@JsonSerializable](/user/JsonSerializable)()
class Entity {
  Entity({
    required this.name,
    this.createdAt = const ServerTimestamp(),
    this.updatedAt = const ServerTimestamp(),
  });

  factory Entity.fromJson(Map<String, dynamic> json) => _$EntityFromJson(json);

  final String name;

  // 处理Dart的 `DateTime` 和 Cloud Firestore的 `Timestamp` 类型
  [@sealedTimestampConverter](/user/sealedTimestampConverter)
  final SealedTimestamp createdAt;

  // 处理Dart的 `DateTime` 和 Cloud Firestore的 `Timestamp` 类型,并且在创建/更新文档时总是使用 `FieldValue.serverTimestamp()`
  [@alwaysUseServerTimestampSealedTimestampConverter](/user/alwaysUseServerTimestampSealedTimestampConverter)
  final SealedTimestamp updatedAt;

  Map<String, dynamic> toJson() => _$EntityToJson(this);
}

void main() {
  final epoch = DateTime(1970);
  final entity = Entity(name: 'foo', createdAt: ClientDateTime(epoch));

  print(entity.name); // 输出: 'foo'
  print(entity.createdAt.dateTime); // 输出: 1970-01-01 00:00:00.000
  print(entity.updatedAt.dateTime); // 输出: null

  final json = entity.toJson();

  print(json['name']); // 输出: 'foo'
  print(json['createdAt']); // 输出: Timestamp(seconds=0, nanoseconds=0)
  print(json['updatedAt']); // 输出: FieldValue(Instance of 'MethodChannelFieldValue')
}

获取 DateTime

当你想在Dart客户端获取 DateTime 值时,可以调用 SealedTimestamp.dateTime 方法:

final epoch = DateTime(1970);
final entity = Entity(name: 'foo', createdAt: ClientDateTime(epoch));

print(entity.createdAt.dateTime); // 输出: 1970-01-01 00:00:00.000

完整示例

以下是一个完整的示例,展示了如何在Flutter项目中使用 flutterfire_json_converters

import 'package:flutter/material.dart';
import 'package:flutterfire_json_converters/flutterfire_json_converters.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

part 'main.g.dart';

[@JsonSerializable](/user/JsonSerializable)()
class Entity {
  Entity({
    required this.name,
    this.createdAt = const ServerTimestamp(),
    this.updatedAt = const ServerTimestamp(),
  });

  factory Entity.fromJson(Map<String, dynamic> json) => _$EntityFromJson(json);

  final String name;

  [@sealedTimestampConverter](/user/sealedTimestampConverter)
  final SealedTimestamp createdAt;

  [@alwaysUseServerTimestampSealedTimestampConverter](/user/alwaysUseServerTimestampSealedTimestampConverter)
  final SealedTimestamp updatedAt;

  Map<String, dynamic> toJson() => _$EntityToJson(this);
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();

    final epoch = DateTime(1970);
    final entity = Entity(name: 'foo', createdAt: ClientDateTime(epoch));
    final json = entity.toJson();

    print(json['name']); // 输出: 'foo'
    print(json['createdAt']); // 输出: Timestamp(seconds=0, nanoseconds=0)
    print(json['updatedAt']); // 输出: FieldValue(Instance of 'MethodChannelFieldValue')
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 flutterfire_json_converters 插件进行数据转换的示例代码。这个插件使得在Flutter应用中,将对象与JSON格式之间进行转换变得更加方便。

首先,确保你已经在你的 pubspec.yaml 文件中添加了 flutterfire_json_converters 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutterfire_json_converters: ^最新版本号  # 替换为当前最新版本号

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

示例代码

假设我们有一个简单的用户模型 User,我们想要将其转换为JSON,并从JSON转换回来。

定义用户模型

import 'package:flutterfire_json_converters/flutterfire_json_converters.dart';

@JsonSerializable()
class User {
  String? name;
  int? age;
  String? email;

  User({this.name, this.age, this.email});

  // 生成的fromJson和toJson方法
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意,我们使用了 @JsonSerializable() 注解,并且定义了 fromJsontoJson 工厂方法和方法。这些方法和函数是通过后续步骤生成的。

生成JSON序列化代码

在你的项目根目录下运行以下命令来生成JSON序列化代码:

flutter pub run build_runner build --build-filter=lib/**/*.dart

这个命令会使用 json_serializable 包生成所需的 fromJsontoJson 方法。

使用转换方法

现在你可以在你的Flutter应用中使用这些转换方法了。例如:

void main() {
  // 创建一个User对象
  User user = User(name: "John Doe", age: 30, email: "john.doe@example.com");

  // 将User对象转换为JSON
  Map<String, dynamic> userJson = user.toJson();
  print("User JSON: $userJson");

  // 从JSON转换回User对象
  User userFromJson = User.fromJson(userJson);
  print("User from JSON: ${userFromJson.name}, ${userFromJson.age}, ${userFromJson.email}");
}

完整示例

结合以上步骤,你的代码结构可能如下:

pubspec.yaml

name: flutter_json_converters_example
description: A new Flutter project.

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutterfire_json_converters: ^最新版本号  # 替换为当前最新版本号
  build_runner: ^2.0.0  # 确保你有build_runner用于代码生成
  json_annotation: ^4.0.0  # 依赖json_serializable所需的json_annotation

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

user.dart

import 'package:flutterfire_json_converters/flutterfire_json_converters.dart';
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  String? name;
  int? age;
  String? email;

  User({this.name, this.age, this.email});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

main.dart

import 'package:flutter/material.dart';
import 'user.dart';

void main() {
  // 创建一个User对象
  User user = User(name: "John Doe", age: 30, email: "john.doe@example.com");

  // 将User对象转换为JSON
  Map<String, dynamic> userJson = user.toJson();
  print("User JSON: $userJson");

  // 从JSON转换回User对象
  User userFromJson = User.fromJson(userJson);
  print("User from JSON: ${userFromJson.name}, ${userFromJson.age}, ${userFromJson.email}");

  // Flutter应用入口点(这里仅为了演示,实际应用中应创建Flutter Widget)
  runApp(MaterialApp(home: Scaffold(body: Center(child: Text("JSON Conversion Example")))));
}

运行 flutter pub getflutter pub run build_runner build --build-filter=lib/**/*.dart 后,你应该能够看到你的Flutter应用正确地将 User 对象与JSON格式进行转换。

回到顶部