为了记录,如果你使用 freezed,这对我有用:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
part 'activity_card_model.freezed.dart';
part 'activity_card_model.g.dart';
DateTime _createdAtFromJson(Timestamp timestamp) => timestamp.toDate();
Timestamp _createdAtToJson(DateTime date) => Timestamp.fromDate(date);
DateTime _updatedAtFromJson(Timestamp timestamp) => timestamp.toDate();
Timestamp _updatedAtToJson(DateTime date) => Timestamp.fromDate(date);
@freezed
abstract class ActivityCard implements _$ActivityCard {
const ActivityCard._();
const factory ActivityCard({
@Default(true) bool active,
@Default('other') String category,
@JsonKey(name: 'created_at', fromJson: _createdAtFromJson, toJson: _createdAtToJson)
required DateTime createdAt,
required String description,
required String heading,
String? id,
@JsonKey(name: 'image_name') @Default('') String imageName,
@JsonKey(name: 'img_src') @Default('') String imageURL,
@JsonKey(name: 'link') String? linkURL,
@JsonKey(name: 'link_description') String? linkDescription,
String? subheading,
@JsonKey(name: 'updated_at', fromJson: _updatedAtFromJson, toJson: _updatedAtToJson)
required DateTime updatedAt,
}) = _ActivityCard;
factory ActivityCard.fromFirestore(DocumentSnapshot doc) {
Map<String, dynamic> json = doc.data as Map<String, dynamic>;
return ActivityCard.fromJson(json);
}
factory ActivityCard.fromJson(Map<String, dynamic> json) =>
_$ActivityCardFromJson(json);
factory ActivityCard.fromDocument(
DocumentSnapshot<Map<String, dynamic>> doc) {
final data = doc.data()!;
return ActivityCard.fromJson(data).copyWith(id: doc.id);
}
Map<String, dynamic> toDocument() => toJson()..remove('id');
}