【发布时间】:2021-08-01 00:42:44
【问题描述】:
我正在尝试在 android studio 中使用 dart-flutter 构建一个群聊应用。一切都很顺利,直到我需要按发送时间的顺序显示消息。为此,我在firebase中创建了一个字段“时间戳”,并且我还使用“FieldValue.serverTimestamp()”传递了时间戳,但是当我尝试通过使用orderBy()来使用“时间戳”时......我没有得到消息显示,而是告诉没有值(null),但是当我尝试在不使用 orderBy() 的情况下访问消息时,它工作正常
看看我将“FieldValue.serverTimestamp()”传递给“timestamp”的小部件:
@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,
),
),
],
),
),
],
),
),
);
}
}
还要检查我尝试使用 orderBy() 的小部件
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)
),
);
});
}
}
最后我还附上了聊天屏幕(模拟器)图像(截图),它告诉我没有价值
如果您有任何问题或需要有关代码的更多详细信息,可以问我
【问题讨论】:
-
你必须在firestore中写一个索引,有时会在控制台中显示为链接
标签: android firebase flutter google-cloud-firestore firebase-cloud-messaging