Android 在flatter中使用orderBy()时,firebase firestore中没有值
我正在尝试在android studio中使用dart Flatter构建一个群组聊天应用程序。在我需要按发送的时间顺序显示消息之前,一切都很顺利。为此,我在firebase中创建了一个字段“timestamp”,并使用“FieldValue.serverTimestamp()”传递时间戳,但当我尝试使用orderBy()使用“timestamp”时。。我没有显示mesages,相反,它告诉我没有值(null),但是当我尝试在不使用orderBy()的情况下访问消息时,它工作正常 看看我将“FieldValue.serverTimestamp()”传递给“timestamp”的小部件:Android 在flatter中使用orderBy()时,firebase firestore中没有值,android,firebase,flutter,google-cloud-firestore,firebase-cloud-messaging,Android,Firebase,Flutter,Google Cloud Firestore,Firebase Cloud Messaging,我正在尝试在android studio中使用dart Flatter构建一个群组聊天应用程序。在我需要按发送的时间顺序显示消息之前,一切都很顺利。为此,我在firebase中创建了一个字段“timestamp”,并使用“FieldValue.serverTimestamp()”传递时间戳,但当我尝试使用orderBy()使用“timestamp”时。。我没有显示mesages,相反,它告诉我没有值(null),但是当我尝试在不使用orderBy()的情况下访问消息时,它工作正常 看看我将“Fi
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
前导:空,
行动:[
图标按钮(
图标:图标(Icons.close),
已按下:(){
_auth.signOut();
pushNamed(上下文,LoginScreen.id);
//实现注销功能
}),
],
标题:文本('⚡️聊天室),,
背景颜色:Colors.lightBlueAccent,
),
正文:安全区(
子:列(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
//忽略:缺少返回
消息流(firestore:_firestore),
容器(
装饰:kMessageContainerDecoration,
孩子:排(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
扩大(
孩子:TextField(
控制器:messageTextController,
样式:TextStyle(颜色:Colors.black),
一旦更改:(值){
messageText=值;
//对用户输入执行一些操作。
},
装饰:KMessageExtField装饰,
),
),
文本按钮(
已按下:(){
messageTextController.clear();
_firestore.collection('messages')。添加(
{'text':messageText,'sender':loggedIn.email,'timestamp':FieldValue.serverTimestamp()},
);
},
子:文本(
“发送”,
样式:ksendButtonExtStyle,
),
),
],
),
),
],
),
),
);
}
}
还要检查我尝试使用orderBy()的小部件
class messageStream扩展了无状态小部件{
消息流({
@需要这个。firestore,
}) ;
最终FirebaseFirestore firestore;
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:firestore.collectionGroup('messages').orderBy('timestamp',降序:true).快照(),
//忽略:缺少返回
生成器:(上下文,快照){
最终消息=snapshot.data.docs;
列表messageBubbles=[];
for(消息中的var消息){
final messageText=message.data()['text'];
final messageSender=message.data()['sender'];
如果(_auth.currentUser.email==messageSender){
final meassageBubble=messageBubble(文本:messageText,发件人:messageSender,crossAxisAlignment:crossAxisAlignment.end,颜色:Colors.lightBlueAccent,文本颜色:Colors.white,左上角:Radius.circular(30),右上角:Radius.circular(0));
messageBubbles.add(meassageBubble);
}
否则{
final meassageBubble=messageBubble(文本:messageText,发件人:messageSender,crossAxisAlignment:crossAxisAlignment.start,颜色:Colors.white,textColor:Colors.black,左上角:半径。圆形(0),右上角:半径。圆形(30));
messageBubbles.add(meassageBubble);
}
}
扩大回报(
子:SingleChildScrollView(
相反:是的,
填充:边缘组。对称(垂直:20,水平:15),
子项:列(子项:messageBubbles)
),
);
});
}
}
最后,我还附加了聊天屏幕(仿真器)图像(屏幕截图),其中显示没有价值
此外,如果您有任何问题或需要有关代码的更多详细信息,可以询问我您必须在firebase控制台中创建索引,Flatter将在您的日志中提供链接: 然后选择创建索引
您必须在firestore中写入索引,控制台中的链接显示了某些时间,但它需要两个字段,我只需要访问“时间戳”字段。。。我已经在另一个字段的帮助下创建了索引,但同样的错误正在发生(文档没有价值)…它将提供两个链接,然后单击“创建索引”链接在哪里?在您的颤振日志中,它将生成一个链接,请参见我的答案
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: null,
actions: <Widget>[
IconButton(
icon: Icon(Icons.close),
onPressed: () {
_auth.signOut();
Navigator.pushNamed(context, LoginScreen.id);
//Implement logout functionality
}),
],
title: Text('⚡️Chat'),
backgroundColor: Colors.lightBlueAccent,
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
// ignore: missing_return
messageStream(firestore: _firestore),
Container(
decoration: kMessageContainerDecoration,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
child: TextField(
controller: messageTextController,
style: TextStyle(color: Colors.black),
onChanged: (value) {
messageText = value;
//Do something with the user input.
},
decoration: kMessageTextFieldDecoration,
),
),
TextButton(
onPressed: () {
messageTextController.clear();
_firestore.collection('messages').add(
{'text': messageText, 'sender': loggedIn.email,'timestamp':FieldValue.serverTimestamp()},
);
},
child: Text(
'Send',
style: kSendButtonTextStyle,
),
),
],
),
),
],
),
),
);
}
}
class messageStream extends StatelessWidget {
messageStream({
@required this.firestore,
}) ;
final FirebaseFirestore firestore;
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: firestore.collectionGroup('messages').orderBy('timestamp', descending: true).snapshots(),
// ignore: missing_return
builder: (context, snapshot) {
final messages = snapshot.data.docs;
List<messageBubble> messageBubbles = [];
for (var message in messages) {
final messageText = message.data()['text'];
final messageSender = message.data()['sender'];
if(_auth.currentUser.email == messageSender){
final meassageBubble = messageBubble(text: messageText, sender: messageSender , crossAxisAlignment: CrossAxisAlignment.end,color: Colors.lightBlueAccent,textColor: Colors.white , topLeft: Radius.circular(30),topRight: Radius.circular(0),);
messageBubbles.add(meassageBubble);
}
else{
final meassageBubble = messageBubble(text: messageText, sender: messageSender , crossAxisAlignment: CrossAxisAlignment.start,color: Colors.white,textColor: Colors.black , topLeft: Radius.circular(0),topRight: Radius.circular(30));
messageBubbles.add(meassageBubble);
}
}
return Expanded(
child: SingleChildScrollView(
reverse: true ,
padding: EdgeInsets.symmetric(vertical: 20 ,horizontal: 15),
child: Column(children: messageBubbles)
),
);
});
}
}