Flutter对接Firebase存储日期时DateTime无法赋值给Timestamp报错如何解决?
问题原因
Firebase Firestore 用于存储时间的专有类型是 Timestamp,你当前代码中 Task 类的 due 字段声明为 Timestamp 类型,但创建 Task 实例时传入的 _date 是 Dart 原生的 DateTime 类型,两者类型不匹配,所以触发了该编译错误。
解决方案
方案1:快速修复(不改动现有模型结构)
直接在创建 Task 实例时,将 DateTime 转换为 Timestamp 即可解决报错:
将原代码:
Task task = Task(budget: _sliderValue, due: _date);
修改为:
Task task = Task(budget: _sliderValue, due: Timestamp.fromDate(_date));
后续从 Firestore 读取该字段需要用于前端展示时,调用 toDate() 方法即可转回 DateTime 类型:
DateTime date = task.due.toDate();
方案2:优化模型(上层业务直接使用DateTime)
你也可以直接修改 Task 模型,把类型转换逻辑封装在模型内部,后续业务层直接使用更易用的 DateTime 类型,无需手动处理转换:
修改后的模型代码:
import 'package:cloud_firestore/cloud_firestore.dart'; class Task { final String id; final double budget; final DateTime due; Task({ required this.id, required this.budget, required this.due, }); // 从Firestore文档转模型时,自动把Timestamp转为DateTime factory Task.fromDoc(DocumentSnapshot doc) { final data = doc.data() as Map<String, dynamic>; return Task( id: data['id'], budget: data['budget'], due: (data['due'] as Timestamp).toDate(), ); } // 模型转Firestore存储用的Map时,自动把DateTime转为Timestamp Map<String, dynamic> toMap() { return { 'due': Timestamp.fromDate(due), 'budget': budget, 'status': 'open', }; } }
修改后写入数据的逻辑可以直接调用封装好的 toMap() 方法,更加简洁:
static void updateDate({required String taskId, required Task task}) { DocumentReference taskRef = tasksRef.doc(taskId); taskRef.update(task.toMap()); }
内容的提问来源于stack exchange,提问作者Boss Nass
相关产品推荐
相关产品推荐

