使用 StreamBuilder 时如何将 serverTimestamp 转换为 String
How to convert serverTimestamp to String when using StreamBuilder
我想要的
根据服务器时间戳排序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(),
预期行为
列表视图根据服务器时间戳顺序显示
我得到了什么
这个错误:
Expected a value of type 'String', but got one of type 'Timestamp'
我试过的
我尝试在将数据发送到 firestore 时添加 toString()
:'timestamp': FieldValue.serverTimestamp().toString()
,但是 firestore 上的数据没有存储时间戳,而是存储了 FieldValue(Instance of 'FieldValueWeb')
.
我知道当我从 firestore 获取数据时可能必须将它们转换为字符串,但我不知道该怎么做。我试过在将数据放入流中时添加 toString()
:
stream: FirebaseFirestore.instance.collection('things').orderBy('timestamp').toString().snapshots()
但随后显示以下错误且无法编译。
The method 'snapshots' isn't defined for the type 'String'.
官方文档也没有说明将它们转换为String。
如果有人知道如何解决这个问题,请帮助我,我真的被困在这里了。
完整的 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,
),
);
},
);
你可以试试这个:
Firestore.instance
.collection("things")
.orderBy('createdAt', descending: true or false).getDocuments()
然后您可以使用时间戳在您的客户端存储 createdAt,您可以使用 Timestamp.now()
获取当前时间戳
由于预期的行为是 ListView
项是根据服务器时间戳排序的,因此您可以在从 Firestore
.
获取列表后对其进行排序
final things = snapshot.data.docs;
things.sort((a, b) {
return (a['timestamp'] as Timestamp).compareTo(b['timestamp'] as Timestamp);
});
这个问题和我最初想的完全不一样。
老实说,我忘记了当我从 Firestore 检索数据进行处理时,我将 Map
设置为 Map<String, String>
,之前没问题,因为我只有 String,但现在我有时间戳类型,它不起作用。
问题的答案只是简单地将 Map<String, String>
更改为 Map<String, dynamic>
我想要的
根据服务器时间戳排序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(),
预期行为
列表视图根据服务器时间戳顺序显示
我得到了什么
这个错误:
Expected a value of type 'String', but got one of type 'Timestamp'
我试过的
我尝试在将数据发送到 firestore 时添加 toString()
:'timestamp': FieldValue.serverTimestamp().toString()
,但是 firestore 上的数据没有存储时间戳,而是存储了 FieldValue(Instance of 'FieldValueWeb')
.
我知道当我从 firestore 获取数据时可能必须将它们转换为字符串,但我不知道该怎么做。我试过在将数据放入流中时添加 toString()
:
stream: FirebaseFirestore.instance.collection('things').orderBy('timestamp').toString().snapshots()
但随后显示以下错误且无法编译。
The method 'snapshots' isn't defined for the type 'String'.
官方文档也没有说明将它们转换为String。
如果有人知道如何解决这个问题,请帮助我,我真的被困在这里了。
完整的 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,
),
);
},
);
你可以试试这个:
Firestore.instance
.collection("things")
.orderBy('createdAt', descending: true or false).getDocuments()
然后您可以使用时间戳在您的客户端存储 createdAt,您可以使用 Timestamp.now()
获取当前时间戳由于预期的行为是 ListView
项是根据服务器时间戳排序的,因此您可以在从 Firestore
.
final things = snapshot.data.docs;
things.sort((a, b) {
return (a['timestamp'] as Timestamp).compareTo(b['timestamp'] as Timestamp);
});
这个问题和我最初想的完全不一样。
老实说,我忘记了当我从 Firestore 检索数据进行处理时,我将 Map
设置为 Map<String, String>
,之前没问题,因为我只有 String,但现在我有时间戳类型,它不起作用。
问题的答案只是简单地将 Map<String, String>
更改为 Map<String, dynamic>