Flutter使用StreamBuilder时遇Timestamp与DateTime类型不匹配错误求助
Flutter StreamBuilder数据类型不匹配问题解决
错误信息
type 'Timestamp' is not a subtype of type 'DateTime?'
问题原因
Firebase Firestore存储DateTime类型数据时,会自动将其转换为Timestamp类型保存。但读取数据时,直接把Firestore返回的Timestamp赋值给MessageModel里的DateTime? createdon变量,就会触发类型不匹配错误。
解决方案
修改MessageModel的fromMap构造方法,将Firestore返回的Timestamp类型转换为DateTime类型即可:
修改后的MessageModel类
class MessageModel { String? messageid; String? sender; String? msg; bool? isseen; DateTime? createdon; MessageModel({this.messageid, this.sender, this.createdon, this.isseen, this.msg}); MessageModel.fromMap(Map<String, dynamic> map) { messageid = map['messageid']; sender = map['sender']; msg = map['msg']; isseen = map['isseen']; // 关键修改:将Timestamp转换为DateTime,兼容null情况 createdon = map['createdon'] != null ? (map['createdon'] as Timestamp).toDate() : null; } Map<String, dynamic> toMap() { return { 'messageid': messageid, 'sender': sender, 'msg': msg, 'isseen': isseen, 'createdon': createdon, }; } }
额外说明
- 写入Firestore时直接传入
DateTime类型是正常的,Firestore会自动转成Timestamp存储,所以你的sendmessage函数无需修改。 - 如果项目中有大量时间类型需要处理,也可以用
json_serializable配合Cloud Firestore的序列化支持,自动完成类型转换,减少手动编码量。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

