Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

'Timestamp isn't a type' により、flutter buildが通らない

Firestoreのタイムスタンプ型をDartのDateTimeに変換する時に、1時間ほどハマってしまったので。

freezedを使っている人は多いと思いますが、DateTime⇔Timestampを変換するには、以下のようなコンバーターを噛ます必要があります。

class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
  const TimestampConverter();

  @override
  DateTime fromJson(Timestamp json) => json.toDate();

  @override
  Timestamp toJson(DateTime object) => Timestamp.fromDate(object);
}

flutter run しようとすると、「Timestamp isn't a type」でコケてしまい、Dartのエラーが出ました。型を解決できないって話らしい。xxx.g.dartでおなじみ、json_serializableが自動生成したコードで、それが出た。

結論から言えば、xxx.g.dartの元のクラスで、cloud_firestore.dartをインポートする必要があった。

import 'package:cloud_firestore/cloud_firestore.dart'; //これがないと型解決できない

part 'hoge.freezed.dart';
part 'hoge.g.dart';

@freezed
class Hoge with _$Hoge {
  const factory Hoge({
    @TimestampConverter() required DateTime joined,
  }) = _Hoge;
  factory Hoge.fromJson(Map<String, dynamic> json) => _$HogeFromJson(json);
}

part で分割されたコードにおいて、解決できない型があっても、Dartコンパイルエラーにならなかった。そういうもんなのかな。dart:core にない型なので参照が必要なのはそれはそう、って感じ。