我想从Firestore获取会议并将其映射到以下会议
模型中:
part 'meeting.g.dart';
@JsonSerializable(explicitToJson: true)
class Meeting {
String id;
DateTime date;
Meeting(this.id, this.date);
factory Meeting.fromJson(Map<String, dynamic> json) {
return _$MeetingFromJson(json);
}
Map<String, dynamic> toJson() => _$MeetingToJson(this);
}
从Firestore获取文档,然后在iterable上调用< code>fromJson,但会引发一个异常:
type 'Timestamp' is not a subtype of type 'String' in type cast
当我进入生成的< code>meeting.g.dart时,就是这一行导致了错误
json['date'] == null ? null : DateTime.parse(json['date'] as String)
为了解决此问题,我尝试在模型中从 DateTime 更改为 Timestamp,但随后显示以下生成错误:
Error running JsonSerializableGenerator
Could not generate `fromJson` code for `date`.
None of the provided `TypeHelper` instances support the defined type.
你能告诉我你如何解决这个问题吗?有没有另一种首选方法可以使用json_serializable进行JSON序列化来组合Firebase和Flutter项目?也许甚至可以取代json_serializable的用法?
使用toJson
和fromJson
converter函数,如下例所示:https://github.com/dart-lang/json_serializable/blob/master/example/lib/example.dart
该解决方案的好处是您不必对属性名称进行硬编码
在阅读了https://github.com/dart-lang/json_serializable/issues/351,的文章后,我修改了< code>Meeting.fromJson,现在它可以正常工作了:
factory Meeting.fromJson(Map<String, dynamic> json) {
json["date"] = ((json["date"] as Timestamp).toDate().toString());
return _$MeetingFromJson(json);
}
json["date"]
是Timestamp
默认情况下,我将其转换为String
,在它到达生成的反序列化程序之前,因此当它尝试将json["date"]转换为String
时不会崩溃
虽然,我不太喜欢这个解决方法,因为我必须硬编码属性的名称和耦合类型,但就目前而言,这个解决方案已经足够好了。
另一种选择是尝试https://pub.dev/packages/built_valueseraliazion,这是在他们的博客中推荐的https://flutter.dev/docs/development/data-and-backend/json
感谢@Reed,指明了正确的方向。当将< code>DateTime值传递给< code>FireStore时,firebase将该值作为< code>Timestamp似乎没有问题,但是在取回该值时,需要对其进行适当的处理。不管怎样,这是一个双向的例子:
import 'package:cloud_firestore/cloud_firestore.dart'; //<-- dependency referencing Timestamp
import 'package:json_annotation/json_annotation.dart';
part 'test_date.g.dart';
@JsonSerializable(anyMap: true)
class TestDate {
@JsonKey(fromJson: _dateTimeFromTimestamp, toJson: _dateTimeAsIs)
final DateTime theDate;
TestDate({this.theDate,});
factory TestDate.fromJson(Map<String, dynamic> json) {
return _$TestDateFromJson(json);
}
Map<String, dynamic> toJson() => _$TestDateToJson(this);
static DateTime _dateTimeAsIs(DateTime dateTime) => dateTime; //<-- pass through no need for generated code to perform any formatting
// https://stackoverflow.com/questions/56627888/how-to-print-firestore-timestamp-as-formatted-date-and-time-in-flutter
static DateTime _dateTimeFromTimestamp(Timestamp timestamp) {
return DateTime.parse(timestamp.toDate().toString());
}
}
使用JsonConverter
class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
const TimestampConverter();
@override
DateTime fromJson(Timestamp timestamp) {
return timestamp.toDate();
}
@override
Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}
@JsonSerializable()
class User{
final String id;
@TimestampConverter()
final DateTime timeCreated;
User([this.id, this.timeCreated]);
factory User.fromSnapshot(DocumentSnapshot documentSnapshot) =>
_$UserFromJson(
documentSnapshot.data..["_id"] = documentSnapshot.documentID);
Map<String, dynamic> toJson() => _$UserToJson(this)..remove("_id");
}
我得到这个错误列表是不是一个类型的子类型字符串在类型铸造,目前我正在发送的形式数据在体内,因为服务器不接受任何原始请求 //服务器响应,表示服务器成功接收并返回状态200
我取一些产品从服务器,但我得到了一个错误,说明另一个例外被抛出:不正确使用家长DataWidget。同步快照 这是我的ProductModel课程 这是主页 这是JsonResorts
当我运行我的代码时,它返回了错误:类型“Future”不是类型转换中“List”类型的子类型。我该如何修复它?它是在我从Firebase获取数据之前匹配引擎运行的?我试图将wait添加到List demoProfiles=getdata()作为wait List;但它返回错误。我真的是新手,这个问题已经困扰了我一整天。请帮帮我
我对flatter是个新手,我想呈现一个ListView。但是我犯了一个错误。 我有3个模型课: 主题、主题和内容。 这是模型文件: 这是文件: 问题出现在。 错误消息是:
我试图在Dart中反序列化一个非常复杂的JSON,但是我不知道出了什么问题。 当它尝试反序列化时,它向我显示了以下错误:“type'\u InternalLinkedHashMap” 有人知道发生了什么事吗? 这是我的密码:
我试图将一个嵌套的JSON对象发布到API。下面是我正在尝试的简单代码。 我收到错误消息: