【问题标题】:How to add server timestamp to firestore document in flutter?如何在flutter中将服务器时间戳添加到firestore文档?
【发布时间】:2022-01-09 18:56:34
【问题描述】:

我是 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实现吗?

参考问题 Flutter: Firebase FieldValue.serverTimestamp() to DateTime object

【问题讨论】:

    标签: flutter google-cloud-firestore flutter-web


    【解决方案1】:

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

    例子:

     FieldValue.serverTimestamp().toString(); 
    

    或者只是:

     "${FieldValue.serverTimestamp()}";
    

    【讨论】:

    • 当使用 FieldValue.serverTimestamp();它没有显示任何错误。但是字段中保存的值是“FieldValue(Instance of 'FieldValueWeb')”而不是时间戳。
    • FieldValue.serverTimestamp() 作为返回类型有什么?尝试从中获取实际值,如果不是,则将其转换为字符串。 (可能您已添加“${FieldValue.serverTimestamp()}”,因此它可能会返回“FieldValueWeb”的实例)。
    • “FieldValue.serverTimestamp() 不是一个时间戳,而是一个所谓的哨兵——一个被发送到服务器的标记,然后服务器识别并解释它以写入当前时间戳。” stackoverflow.com/questions/57410208/…
    • 比简单地做:final DateTime dateTimeFromServerTimeStamp = (documentSnapshot.data()['serverTimeStamp'] as Timestamp).toDate();将您的 serverTimestamp 转换为 Date 类型,然后将该值作为字符串传递,例如 x["updatedAt"] = '$dateTimeFromServerTimeStamp';简单来说,您将 FieldValue.serverTimestamp() 转换为 Date 类型,然后将该日期作为字符串传递给请求参数;
    • 这是一种方法,但实现它的方法很复杂。此外,它必须将时间作为字符串存储在 firestore 数据库中。 1)有什么方法可以将时间戳变量存储在firestore中,而无需先将其转换为字符串? 2) 我试图通过传递 FieldValue.serverTimestamp() 来指示服务器在字段上放置时间戳。可以通过flutter实现吗?
    【解决方案2】:

    这行抛出了错误

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

    原因:我将 doc 声明为 var

    var doc = { "subject": subjectName };
    

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2018-07-14
      • 2018-11-07
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多