firebase - 如何用颤振连续排列云存储文件?
问题描述
我正在尝试在flutter中创建带有firebase的聊天演示应用程序,但是当我发送消息时,这些消息文档会在firestore数据库中的任何位置随机创建。这就是为什么我的聊天屏幕消息的方式不对,意味着没有按时间安排。
一些代码:
将消息详细信息保存到 Firestore 的方法:
Future<void> sendMesssage() async{
if(messagesController.text.length>0){
String msgId = firestore.collection("messages").document().documentID.toString();
await firestore.collection("messages").document(msgId).setData({
'text': messagesController.text,
"from": widget.user.user.email, //sender email Id
"to":widget.chatMateEmail, // receiver email id
"msgId":msgId,
"senderUid": widget.user.user.uid, //sender uid
"receiverUid":widget.receiverUid //receiver uid
});
messagesController.clear();
}
}
UI 聊天界面:
从 Firestore 获取消息的方法:
Expanded(
child: StreamBuilder<QuerySnapshot>(
stream: firestore.collection("messages").snapshots(),
builder: (context, snapshot){
if(snapshot.hasError){
return Center(child: Text("${snapshot.error}"),);
}
if(!snapshot.hasData){
return Center(child: CircularProgressIndicator(),);
}else{
List<DocumentSnapshot> docs = snapshot.data.documents;
return
Padding(
padding: const EdgeInsets.all(8.0),
child: ListView.builder(
itemCount: docs.length,
itemBuilder: (context, index){
print("Messagessssssss:${docs[index]['text']}");
return Message( // custom class
from: docs[index]['from'],
text: docs[index]['text'],
me: widget.user.user.email == docs[index]['from'],
);
},
),
);
}
},
),
),
聊天画面:
我的 Cloud Firestore 屏幕截图:
解决方案
根据@DougStevenson 先生的回答解决了,我添加了名为“messageTime”的新字段并添加了 DateTime.now(),并根据 messageTime 获取消息(按升序排序)。
我修改了一些代码并完美运行:
Future<void> sendMesssage() async{
if(messagesController.text.length>0){
String msgId = firestore.collection("messages").document().documentID.toString();
await firestore.collection("messages").document(msgId).setData({
..........
"messageTime": DateTime.now() // message DateTime
});
messagesController.clear();
}
}
Expanded(
child: StreamBuilder<QuerySnapshot>(
stream: firestore.collection("messages").orderBy('messageTime', descending: false).snapshots(), //and sort by ascending order according to datetime.
builder: (context, snapshot){
......
},
),
),
推荐阅读
- php - 你如何在html中格式化php?
- python-3.x - 在报告中的 Pandas 打印 info() 条目和索引号不一样
- php - PHP & MySQL:将选择结果插入 id 为 auto_increment 的表中
- python - 嵌套列表中的 Cerberus 强制
- botframework - 如何在 botframework v3 中调用多个 PromptDialog
- c - 如何为luajit的ffi实现X11(返回屏幕像素的颜色)C代码?
- ios - iOS 9:“在严格模式下意外使用了保留字 'let'”+“找不到变量:获取”。转译问题?怎么修?
- c - C - 为什么这个函数将数组打印为 NULL 字符串?
- c# - 使用内存节点进行 EventStore 集成测试
- python - 为什么在递归过程中变量会发生变化(试图计算矩阵行列式)