Flutter中Firestore Timestamp转DateTime格式化传参报错解决方法
报错原因
你代码里多余的Timestamp构造操作是报错的根源:
从Firestore拉取到的文档数据中,data['paidDate']本身就已经是Timestamp类型的实例,完全不需要再调用Timestamp()构造函数新建对象。Timestamp()构造要求传入秒、纳秒两个整型参数,你把现成的Timestamp实例当参数传入,参数类型完全不匹配,自然会触发报错。
修复方案
直接在读取到的paidDate字段上调用.toDate()方法即可,不需要额外套一层Timestamp构造。
另外注意两个容易踩的类型问题:
- 从文档快照里取出来的字段默认是
dynamic类型,最好手动做一次类型强转,避免类型推断异常 - 如果
amount字段存储的是数字类型(int/double),直接传给Text组件也会报类型错误,需要转成字符串再传入
修正后的可运行代码:
return Center( child: Container( child: DataTable( columns: const [ DataColumn(label: Text('Amount')), DataColumn(label: Text('Paid Date')) ], rows: snapshot.data!.docs.map((data) { // 直接对已拿到的Timestamp实例调用toDate方法 final paidDateTime = (data['paidDate'] as Timestamp).toDate(); return DataRow(cells: [ DataCell(Text(data['amount'].toString())), DataCell(Text(DateFormat('yMd').format(paidDateTime))) ]); }).toList(), ), ), );
如果你的paidDate字段允许为空,加一层空判断兜底即可:
final paidDateValue = data['paidDate']; // 空值可以替换成你需要的默认展示时间 final paidDateTime = paidDateValue != null ? (paidDateValue as Timestamp).toDate() : DateTime.now();
内容的提问来源于stack exchange,提问作者Ganesh Sivakumar
相关产品推荐
相关产品推荐

