JsonConverterで独自コンバータを作成
FirestoreのTimestampをFlutterのDateTimeに変換
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
class TimestampConverter implements JsonConverter<DateTime?, Timestamp?> {
const TimestampConverter();
@override
DateTime? fromJson(Timestamp? json) => json?.toDate();
@override
Timestamp? toJson(DateTime? object) =>
object == null ? null : Timestamp.fromDate(object);
}
使い方
import 'package:freezed_annotation/freezed_annotation.dart';
part 'post.freezed.dart';
part 'post.g.dart';
@freezed
class Post with _$Post {
const factory Post({
required int id,
required String title,
@TimestampConverter() DateTime? createdAt,
}) = _Post;
}
参考記事
FirestoreのDocumentReferenceを取得
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
class DocumentReferenceConverter
implements JsonConverter<DocumentReference, DocumentReference> {
const DocumentReferenceConverter();
@override
DocumentReference fromJson(DocumentReference docRef) => docRef;
@override
DocumentReference toJson(DocumentReference docRef) => docRef;
}
class DocumentReferenceStringConverter
implements JsonConverter<String, DocumentReference> {
const DocumentReferenceStringConverter();
@override
String fromJson(DocumentReference ref) => ref.id;
@override
DocumentReference toJson(String str) => FirebaseFirestore.instance.doc(str);
}
class DocumentReferenceNullStringConverter
implements JsonConverter<String?, DocumentReference?> {
const DocumentReferenceNullStringConverter();
@override
String? fromJson(DocumentReference? ref) => ref?.path;
@override
DocumentReference? toJson(String? str) =>
str != null ? FirebaseFirestore.instance.doc(str) : null;
}
使い方
import 'package:freezed_annotation/freezed_annotation.dart';
part 'post.freezed.dart';
part 'post.g.dart';
@freezed
class Post with _$Post {
const factory Post({
required int id,
required String title,
@DocumentReferenceConverter() required DocumentReference docRef,
@DocumentReferenceStringConverter() required String docRefString,
}) = _Post;
factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json);
}
参考記事
intをColorに変換
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
class ColorConverter implements JsonConverter<Color, int> {
const ColorConverter();
@override
Color fromJson(int value) => Color(value);
@override
int toJson(Color color) => color.value;
}
class ColorNullConverter implements JsonConverter<Color?, int?> {
const ColorNullConverter();
@override
Color? fromJson(int? value) => Color(value ?? 0);
@override
int? toJson(Color? color) => color?.value;
}
使い方
import 'package:freezed_annotation/freezed_annotation.dart';
part 'post.freezed.dart';
part 'post.g.dart';
@freezed
class Post with _$Post {
const factory Post({
required int id,
required String title,
@ColorConverter() required Color textColor,
@ColorNullConverter() Color? backgroundColor,
}) = _Post;
factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json);
}
参考記事