Flutter报错Timestamp不是String子类型,出生日期字段异常排查
问题排查方向
你当前贴出的日期选择、ViewModel赋值、UserModel字段定义逻辑中,dob全程为String类型,Timestamp类型的产生环节集中在Firestore写入/读取解析阶段,可按以下方向逐一排查:
写入逻辑错误
你调用Firestore接口写入用户数据时,可能误将DateTime类型的selected变量作为dob字段值传入,而非已经转成字符串的dateOfBirth。Firestore会自动将DateTime类型转换为Timestamp存储,即便你UserModel里dob定义为String,只要写入时传了DateTime就会产生Timestamp类型的字段。
存在旧的测试数据
确认Firestore控制台中对应文档的dob字段类型:如果有历史测试数据,旧数据的dob字段可能为Timestamp类型。哪怕你后续写入逻辑已修正,只要读取到旧的Timestamp类型dob数据,赋值给String类型的字段就会报类型不匹配错误。
读取解析逻辑错误
你只提供了UserModel的字段定义,没有贴出fromFirestore/fromJson的解析代码:
- 若解析时误将dob字段按Timestamp类型处理(比如调用了
toDate()方法),哪怕Firestore里存的是字符串也会触发报错 - 若解析时没有做类型兼容处理,直接强转
data['dob'] as String,遇到Timestamp类型的字段值就会触发报错
快速定位方法
在你读取Firestore返回数据的位置,添加日志打印dob字段的运行时类型:
var data = snapshot.data() as Map<String, dynamic>; print(data['dob'].runtimeType);
若输出为String则是解析逻辑错误,输出为Timestamp则是写入逻辑错误或存在旧数据问题。
内容的提问来源于stack exchange,提问作者han da
相关产品推荐
相关产品推荐

