如何在 flutter 中将服务器时间戳添加到 firestore 文档?

How to add server timestamp to firestore document in flutter?

我是 Firestore 的新手。当我尝试通过函数 addSubject 中的 add 方法添加文档时,它抛出错误“预期类型 'String' 的值,但得到类型 'FieldValue' 之一”。当我将字段设置为 DateTime.now() 时,我遇到了类似的错误。如何将服务器时间戳添加到文档中?

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

Future<bool> addSubject(FirebaseFirestore x, FirebaseAuth auth, String subjectName) async{
  try {
    var doc = { "subject": subjectName };
    await x.collection('subjects').add(appendCreateAudit(doc, auth));
  } catch (e) {
    print(e);
    return false;
  }
  return true;
}

Map<String, dynamic> appendCreateAudit(Map<String, dynamic> x, FirebaseAuth auth) {
  x["createdAt"] = FieldValue.serverTimestamp();
  x["createdBy"] = auth.currentUser!;
  x["updatedAt"] = FieldValue.serverTimestamp();
  x["updatedBy"] = auth.currentUser!;
  print(x);
  return x;
}

Map<String, dynamic> appendUpdateAudit(Map<String, dynamic> x, FirebaseAuth auth) {
  x["updatedBy"] = auth.currentUser!;
  x["updatedAt"] = FieldValue.serverTimestamp();
  return x;
}

可以将时间戳作为字符串发送,但这不是最佳解决方案。

  1. 有什么方法可以在 firestore 中存储时间戳变量,而无需先将其转换为字符串?
  2. 我试图通过传递 FieldValue.serverTimestamp() 来指示服务器在字段上放置时间戳。可以通过flutter实现吗?

参考问题

您发送的值不是 String 类型。只需在发送前将其转换为 toString() 即可修复错误。

示例:

 FieldValue.serverTimestamp().toString(); 

或者只是:

 "${FieldValue.serverTimestamp()}";

此行抛出错误

x["createdAt"] = FieldValue.serverTimestamp();

原因:我将 doc 声明为 var

var doc = { "subject": subjectName };

Dart 将 doc 解释为 Map 而不是 Map ,因此出现错误。

修复: Map doc = { "subject": subjectName }; 现在工作正常。