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);
}

参考記事


この記事が気に入ったらサポートをしてみませんか?