the*_*der 1 list dart firebase flutter google-cloud-firestore
我想创建一个聊天应用程序,我也使用了 firebase,但我无法订购文档,当您发送消息时,它不符合它在随机位置的列表的顺序。
\n\n我认为这与 firebase 控制台中的文档类型有关(如果相关),我希望获得有关如何在收到新消息时对其进行排序的帮助,它将位于列表的底部,反之亦然。
\n\n我尝试过 listview 和 listview.builder 并且使用了反向属性,但它对我不起作用。
\n\nimport \'package:flutter/material.dart\';\nimport \'package:firebase_auth/firebase_auth.dart\';\nimport \'package:cloud_firestore/cloud_firestore.dart\';\nimport \'../constants.dart\';\n\nfinal _firestore = Firestore.instance;\nFirebaseUser loggedInUser;\n\nclass ChatScreen extends StatefulWidget {\n static String routeName = \'chat_screen\';\n\n @override\n _ChatScreenState createState() => _ChatScreenState();\n}\n\nclass _ChatScreenState extends State<ChatScreen> {\n final messageTextController = TextEditingController();\n final _auth = FirebaseAuth.instance;\n String message;\n\n void getCurrentUser() async {\n try {\n final user = await _auth.currentUser();\n\n if (user != null) {\n loggedInUser = user;\n }\n } catch (e) {\n print(e);\n }\n }\n\n void getMessages() async {\n final messages = await _firestore.collection(\'message\').getDocuments();\n for (var message in messages.documents) {\n print(message.data);\n }\n }\n\n void messagesStream() async {\n await for (var snapshot in _firestore.collection(\'messages\').snapshots()) {\n for (var message in snapshot.documents) {\n print(message.data);\n }\n }\n }\n\n @override\n void initState() {\n super.initState();\n\n getCurrentUser();\n }\n\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n appBar: AppBar(\n leading: null,\n actions: <Widget>[\n IconButton(\n icon: Icon(Icons.close),\n onPressed: () {\n _auth.signOut();\n Navigator.pop(context);\n }),\n ],\n title: Text(\'\xe2\x9a\xa1\xef\xb8\x8fChat\'),\n backgroundColor: Colors.lightBlueAccent,\n ),\n body: SafeArea(\n child: Column(\n mainAxisAlignment: MainAxisAlignment.spaceBetween,\n crossAxisAlignment: CrossAxisAlignment.stretch,\n children: <Widget>[\n MessagesStream(),\n Container(\n decoration: kMessageContainerDecoration,\n child: Row(\n crossAxisAlignment: CrossAxisAlignment.center,\n children: <Widget>[\n Expanded(\n child: TextField(\n controller: messageTextController,\n onChanged: (value) {\n message = value;\n },\n decoration: kMessageTextFieldDecoration,\n ),\n ),\n FlatButton(\n onPressed: () {\n messageTextController.clear();\n _firestore\n .collection(\'messages\')\n .add({\'text\': message, \'sender\': loggedInUser.email});\n },\n child: Text(\n \'Send\',\n style: kSendButtonTextStyle,\n ),\n ),\n ],\n ),\n ),\n ],\n ),\n ),\n );\n }\n}\n\nclass MessagesStream extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return StreamBuilder<QuerySnapshot>(\n stream: _firestore.collection(\'messages\').snapshots(),\n builder: (context, snapshot) {\n if (!snapshot.hasData) {\n return Center(\n child: CircularProgressIndicator(\n backgroundColor: Colors.lightBlueAccent,\n ),\n );\n }\n final messages = snapshot.data.documents;\n\n List<MessageBubble> messageBubbles = [];\n for (var message in messages) {\n final messageText = message.data[\'text\'];\n final messageSender = message.data[\'sender\'];\n final currentUser = loggedInUser.email;\n\n final messageBubble = MessageBubble(\n sender: messageSender,\n text: messageText,\n isMe: currentUser == messageSender);\n\n messageBubbles.add(messageBubble);\n }\n\n return Flexible(\n child: ListView.builder(\n itemCount: messages.length,\n itemBuilder: (context , index){\n return MessageBubble(\n isMe: loggedInUser.email == messages[index].data[\'sender\'],\n text: messages[index].data[\'text\'],\n sender: messages[index].data[\'sender\'],\n );\n },),\n );\n },\n );\n }\n}\n\nclass MessageBubble extends StatelessWidget {\n MessageBubble({this.sender, this.text, this.isMe});\n\n final bool isMe;\n final String sender;\n final String text;\n\n @override\n Widget build(BuildContext context) {\n return Padding(\n padding: EdgeInsets.all(10.0),\n child: Column(\n crossAxisAlignment:\n isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,\n children: <Widget>[\n Text(sender, style: TextStyle(fontSize: 12, color: Colors.black54)),\n Material(\n elevation: 5.0,\n borderRadius: isMe\n ? BorderRadius.only(\n topLeft: Radius.circular(30),\n bottomLeft: Radius.circular(30),\n topRight: Radius.circular(30),\n )\n : BorderRadius.only(\n bottomLeft: Radius.circular(30),\n topRight: Radius.circular(30),\n bottomRight: Radius.circular(30)),\n color: isMe ? Colors.lightBlueAccent : Colors.white,\n child: Padding(\n padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20),\n child: Text(\n text,\n style: TextStyle(\n color: isMe ? Colors.white : Colors.black54,\n fontSize: 15),\n ),\n )),\n ],\n ),\n );\n }\n}\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n
Cloud Firestore 中的文档没有隐式排序。
如果您想按特定顺序显示结果,则必须确保每个文档都包含确定其顺序所需的信息。通常,这意味着您包含一个带有创建文档时的时间戳的字段。
有了这样的字段,您就可以按orderBy()特定顺序检索文档:
await _firestore.collection('message').orderBy('timestamp').getDocuments()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3382 次 |
| 最近记录: |