如何订购firebase的文档?

the*_*der 1 list dart firebase flutter google-cloud-firestore

我想创建一个聊天应用程序,我也使用了 firebase,但我无法订购文档,当您发送消息时,它不符合它在随机位置的列表的顺序。

\n\n

我认为这与 firebase 控制台中的文档类型有关(如果相关),我希望获得有关如何在收到新消息时对其进行排序的帮助,它将位于列表的底部,反之亦然。

\n\n

我尝试过 listview 和 listview.builder 并且使用了反向属性,但它对我不起作用。

\n\n
import \'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\n
Run Code Online (Sandbox Code Playgroud)\n

Fra*_*len 5

Cloud Firestore 中的文档没有隐式排序。

如果您想按特定顺序显示结果,则必须确保每个文档都包含确定其顺序所需的信息。通常,这意味着您包含一个带有创建文档时的时间戳的字段。

有了这样的字段,您就可以按orderBy()特定顺序检索文档:

await _firestore.collection('message').orderBy('timestamp').getDocuments()
Run Code Online (Sandbox Code Playgroud)