从Firebase获取Timestamp遇异常:Null无法转为Timestamp类型
解决Firestore Timestamp类型空值转换异常问题
你遇到的type 'Null' is not a subtype of type 'Timestamp'异常,本质原因是Firestore返回的starts或ends字段为null,但你的Event模型里start和end被定义为非空的Timestamp类型,而构造函数要求必填非空值,当map中对应字段为null时,类型不匹配就会抛出异常。用var时因为var可以接受null,所以不会触发报错。
下面分两种业务场景给出解决方案:
场景1:允许start/end字段为空
如果业务逻辑允许这两个字段缺失,直接将模型中的字段改为可空类型:
import 'package:cloud_firestore/cloud_firestore.dart'; class Event { String eid; String title; String location; Timestamp? start; // 改为可空类型 Timestamp? end; // 改为可空类型 String instructor; String image; String description; Event({ required this.eid, required this.title, required this.location, this.start, // 去掉required,允许不传值或传null this.end, required this.instructor, required this.image, required this.description }); factory Event.fromMap(Map<String, dynamic>? map) { return Event( eid: map?['eid'] ?? 'undefined', title: map?['title'] ?? 'undefined', location: map?['location'] ?? 'undefined', start: map?['starts'], end: map?['ends'], instructor: map?['instructor'] ?? 'undefined', image: map?['image'] ?? 'undefined', description: map?['description'] ?? 'undefined' ); } }
场景2:要求start/end必须有值,设置默认值
如果业务上强制要求这两个字段存在,当Firestore返回null时,给字段设置一个默认的Timestamp值(比如当前时间):
import 'package:cloud_firestore/cloud_firestore.dart'; class Event { String eid; String title; String location; Timestamp start; Timestamp end; String instructor; String image; String description; Event({ required this.eid, required this.title, required this.location, required this.start, required this.end, required this.instructor, required this.image, required this.description }); factory Event.fromMap(Map<String, dynamic>? map) { return Event( eid: map?['eid'] ?? 'undefined', title: map?['title'] ?? 'undefined', location: map?['location'] ?? 'undefined', start: map?['starts'] ?? Timestamp.now(), // 为空时用当前时间做默认值 end: map?['ends'] ?? Timestamp.now(), instructor: map?['instructor'] ?? 'undefined', image: map?['image'] ?? 'undefined', description: map?['description'] ?? 'undefined' ); } }
额外建议:检查Firestore数据完整性
别忘了检查你的Firestore集合中,所有Event文档是否都正确设置了starts和ends字段。如果有缺失的文档,要么补全数据,要么按场景1处理可空情况,从根源避免null值的出现。
内容的提问来源于stack exchange,提问作者CSP
相关产品推荐
相关产品推荐

