首页 > 解决方案 > 参数类型“日期时间”不能分配给参数类型“时间戳”

问题描述

我正在使用 Firebase 和 Flutter 并希望存储到期日期的值,但我收到相互冲突的消息,这不允许我以我希望的格式存储它

模型导入“包:cloud_firestore/cloud_firestore.dart”;

class Task {
  final String id;
  final Timestamp due;


  Task({
    this.id,
    this.due,
  });

  factory Task.fromDoc(DocumentSnapshot doc) {
    return Task(
      id: doc.data()['id'],
      due: doc.data()['due'],
    );
  }
}

写入数据

DateTime _date = DateTime.now();
  TextEditingController _dateController = TextEditingController();

void _selectDate() async {
    final DateTime newDate = await showDatePicker(
      context: context,
      initialDate: _date,
      firstDate: DateTime.now(),
      lastDate: DateTime.now().add(Duration(days: 90)),
      helpText: 'Select date for task',
    );
    if (newDate != null) {
      setState(() {
        _date = newDate;
        _dateController.text =
            DateFormat("E, d MMM yyyy").format(_date).toString();
      });
    }
  }

TextFormField(
                                controller: _dateController,
                                onTap: _selectDate,
                                enabled: true,
                                readOnly: true,
                                decoration: InputDecoration(labelText: 'Date'),
                              ),

Task task = Task(budget: _sliderValue, due: _date);
          DatabaseService.updateDate(taskId: _taskId, task: task);

  static void updateDate({String taskId, Task task}) {
    DocumentReference taskRef = tasksRef.doc(taskId);
    tasksRef.get().then((doc) {
      taskRef.update({
        'due': task.due,
        'budget': task.budget,
        'status': 'open',
      });
    });
  }

标签: flutterdatetimegoogle-cloud-firestoredatepickertimestamp

解决方案


以下行显示_date定义为DateTime

DateTime _date = DateTime.now();

在这里,您尝试将属性传递_dateTask构造函数due

Task task = Task(budget: _sliderValue, due: _date);

但是,due的属性Task必须是Timestamp

class Task {
  final String id;
  final Timestamp due;

...

要修复错误,您需要转换DateTimeTimestamp使用Timestamp.fromDate().

Task task = Task(budget: _sliderValue, due: Timestamp.fromDate(_date));

推荐阅读