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 にない型なので参照が必要なのはそれはそう、って感じ。