Flutter报错:类型'DateTime'不是'String'子类型,Firestore日期读取失败
Flutter + Firestore 日期类型报错
type 'DateTime' is not a subtype of type 'String' 解决方法 报错定位
- 报错的核心原因是代码存在冗余的无效类型转换逻辑:
- Firestore 中存储的日期字段读出来默认是
Timestamp类型,你调用.toDate()之后已经得到了标准的DateTime类型对象 - 你又把该
DateTime对象转成字符串后传给DateTime.parse(),这一步本身多余,且Text组件要求传入的参数是String类型,你最终传给Text的是DateTime类型对象,自然触发类型不匹配报错 - 你写的空判断逻辑也无效:
DateTime.parse只要传入非空字符串就不会返回空,原有逻辑不可能走到'default'分支
- Firestore 中存储的日期字段读出来默认是
解决方案
你只需要把最终得到的 DateTime 转成你需要的字符串格式传给 Text 即可,不需要来回转换类型。
最简写法(直接转字符串展示)
如果不需要自定义日期格式,直接调用 DateTime 的 toString() 方法即可,额外加了空安全判断避免字段为空时报错:
Text( documents[index]['createdAt']?.toDate().toString() ?? 'default', )
自定义格式写法(推荐)
如果需要展示成「2024-05-20 14:30」这类易读的自定义格式,用 intl 包的 DateFormat 做格式化即可:
- 先在
pubspec.yaml中引入依赖
dependencies: intl: ^0.18.1
- 业务代码中使用:
import 'package:intl/intl.dart'; // 组件内使用 Text( documents[index]['createdAt'] != null ? DateFormat('yyyy-MM-dd HH:mm').format(documents[index]['createdAt']!.toDate()) : 'default', )
可以根据需求调整 DateFormat 的格式字符串,支持添加星期、秒数、时区等展示规则。
内容的提问来源于stack exchange,提问作者Nikhil Karve
相关产品推荐
相关产品推荐

