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