2

我想要的是

根据服务器时间戳订购 ListView

我的代码

添加到 Firestore 集合:

onPressed: () {
FirebaseFirestore.instance.collection('things').add(
  {
    // some code
    'timestamp': FieldValue.serverTimestamp(),
  },
);

从 Firestore 获取数据并根据服务器时间戳对它们进行排序

return StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance.collection('things').orderBy('timestamp').snapshots(),

预期行为

列表视图根据服务器时间戳排序显示

我得到了什么

这个错误:

需要一个“字符串”类型的值,但得到一个“时间戳”类型的值

我试过的

我尝试toString()在将数据发送到 firestore: 时添加:'timestamp': FieldValue.serverTimestamp().toString()但后来 firestore 上的数据没有存储时间戳,而是存储了FieldValue(Instance of 'FieldValueWeb').

我知道当我从 firestore 获取数据时,我可能必须将它们转换为 String,但我不知道该怎么做。我尝试在toString()将数据输入流时添加:

stream: FirebaseFirestore.instance.collection('things').orderBy('timestamp').toString().snapshots()

但随后它显示以下错误并且不会编译。

没有为“String”类型定义方法“snapshots”。

官方文档也没有说将它们转换为字符串。

如果有人知道如何解决这个问题,请帮助我,我真的被困在这里。


完整的 StreamBuilder 和 ListView 代码

return StreamBuilder<QuerySnapshot>(
  stream: _firestore.collection('things').orderBy('timestamp').snapshots(),
  builder: (context, snapshot) {
    List<Text> putDataHere = [];

    final things = snapshot.data.docs;
    for (var thing in things) {
      final myData = Map<String, String>.from(thing.data());
      final myThing = myData['dataTitle'];
      final thingWidget = Text(myThing);
      putDataHere.add(thingWidget);
    }
    return Expanded(
      child: ListView(
        children: putDataHere,
      ),
    );
  },
);
4

3 回答 3

1

你可以试试这个:

Firestore.instance
     .collection("things")
     .orderBy('createdAt', descending: true or false).getDocuments()

然后您可以使用 Timestamp 在您的客户端存储 createdAt,您可以使用 Timestamp.now() 获取当前时间戳

于 2021-06-09T15:13:14.100 回答
1

由于预期的行为是ListView根据服务器时间戳对项目进行排序,因此您可以在从Firestore.

    final things = snapshot.data.docs;
    things.sort((a, b) {
        return (a['timestamp'] as Timestamp).compareTo(b['timestamp'] as Timestamp);
    });

于 2021-06-10T12:32:05.573 回答
0

这个问题与我最初的想法完全不同。

老实说,我忘记了当我从 Firestore 检索数据来处理它时,我将我的设置MapMap<String, String>,以前很好,因为我只有 String,但现在我有 Timestamp 类型,它不起作用。

问题的答案只是简单地Map<String, String>Map<String, dynamic>

于 2021-06-10T13:14:45.373 回答