List 如何订购firebase的文档?

List 如何订购firebase的文档?,list,firebase,flutter,dart,google-cloud-firestore,List,Firebase,Flutter,Dart,Google Cloud Firestore,我想创建一个聊天应用程序,我也使用过firebase,但我无法对文档进行排序,因为当你发送消息时,它的顺序与列表中的顺序不一致,而是随机放置 我认为这与firebase控制台中的文档排序有关。如果相关,我需要有关如何排序的帮助,当新消息出现时,它将位于列表的底部,反之亦然 我尝试了listview和listview.builder,并且使用了reverse属性,但它对我不起作用 进口“包装:颤振/材料.省道”; 导入“包:firebase_auth/firebase_auth.dart”; 导入

我想创建一个聊天应用程序,我也使用过firebase,但我无法对文档进行排序,因为当你发送消息时,它的顺序与列表中的顺序不一致,而是随机放置

我认为这与firebase控制台中的文档排序有关。如果相关,我需要有关如何排序的帮助,当新消息出现时,它将位于列表的底部,反之亦然

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

进口“包装:颤振/材料.省道”; 导入“包:firebase_auth/firebase_auth.dart”; 导入“包:cloud_firestore/cloud_firestore.dart”; 导入“../constants.dart”; final _firestore=firestore.instance; FirebaseUser日志用户; 类ChatScreen扩展StatefulWidget{ 静态字符串routeName='chat_screen'; @凌驾 _ChatScreenState createState=>\u ChatScreenState; } 类_ChatScreenState扩展状态{ 最终消息TextController=TextEditingController; final _auth=FirebaseAuth.instance; 字符串消息; 无效getCurrentUser异步{ 试一试{ 最终用户=等待_auth.currentUser; 如果用户!=null{ loggedInUser=用户; } }抓住e{ 印刷品; } } void getMessages异步{ final messages=wait_firestore.collection'message'.getDocuments; 对于messages.documents中的var消息{ printmessage.data; } } 异步消息流无效{ 在_firestore.collection'messages.snapshots中等待var快照{ 对于snapshot.documents中的var消息{ printmessage.data; } } } @凌驾 无效初始状态{ super.initState; getCurrentUser; } @凌驾 小部件构建上下文上下文{ 返回脚手架 appBar:appBar 前导:空, 行动:[ 图标按钮 图标:IconIcons.close, 按下按钮:{ _授权注销; Navigator.popcontext; }, ], 标题:文本'⚡️聊天",, 背景颜色:Colors.lightBlueAccent, , 正文:安全区 子:列 mainAxisAlignment:mainAxisAlignment.spaceBetween, crossAxisAlignment:crossAxisAlignment.stretch, 儿童:[ 消息流, 容器 装饰:kMessageContainerDecoration, 孩子:排 crossAxisAlignment:crossAxisAlignment.center, 儿童:[ 扩大 孩子:TextField 控制器:messageTextController, 一旦改变:价值{ 消息=值; }, 装饰:KMessageExtField装饰, , , 扁平按钮 按下按钮:{ messageTextController.clear; _火库 .收集“信息” .add{'text':消息,'sender':loggedInUser.email}; }, 子:文本 “发送”, 样式:ksendButtonExtStyle, , , ], , , ], , , ; } } 类MessagesStream扩展了无状态小部件{ @凌驾 小部件构建上下文上下文{ 返回流生成器 流:_firestore.collection'messages'。快照, 生成器:上下文、快照{ 如果!snapshot.hasData{ 返回中心 子对象:循环压缩机指示器 背景颜色:Colors.lightBlueAccent, , ; } 最终消息=snapshot.data.documents; 列表messageBubbles=[]; 对于消息中的var消息{ final messageText=message.data['text']; final messageSender=message.data['sender']; 最终currentUser=loggedInUser.email; final messageBubble=messageBubble 发件人:messageSender, text:messageText, isMe:currentUser==messageSender; messageBubbles.addmessageBubble; } 回程灵活 子项:ListView.builder itemCount:messages.length, itemBuilder:上下文、索引{ 返回消息气泡 isMe:loggedInUser.email==邮件[index]。数据['sender'], text:messages[index]。数据['text'], 发件人:邮件[index]。数据['sender'], ; },, ; }, ; } } 类MessageBubble扩展了无状态小部件{ MessageBubble{this.sender,this.text,this.isMe}; 最终目标; 最终字符串发送器; 最终字符串文本; @凌驾 小部件构建上下文上下文{ 返回填充 填充:EdgeInsets.所有10.0, 孩子:上校 umn 横轴对齐: 伊斯米?CrossAxisAlignment.end:CrossAxisAlignment.start, 儿童:[ Textsender,样式:TextStylefontSize:12,颜色:Colors.black 54, 布料 标高:5.0, 边界半径:isMe ?仅限边界半径 左上角:半径30, 左下角:半径30, 右上角:半径30, :仅限边界半径 左下角:半径30, 右上角:半径30, 右下角:半径30, 颜色:isMe?颜色。浅蓝色口音:颜色。白色, 孩子:填充 填充:边集。对称垂直:10,水平:20, 子:文本 文本 样式:TextStyle 颜色:isMe?颜色。白色:颜色。黑色54, 尺寸:15, , , ], , ; } } 按添加订单

void getMessages() async {
    final messages = await _firestore.collection('message').orderBy("created_at", descending: true).getDocuments();
    for (var message in messages.documents) {
      print(message.data);
    }
  }

  void messagesStream() async {
    await for (var snapshot in _firestore.collection('messages').orderBy("created_at", descending: true).snapshots()) {
      for (var message in snapshot.documents) {
        print(message.data);
      }
    }
  }
按添加订单

void getMessages() async {
    final messages = await _firestore.collection('message').orderBy("created_at", descending: true).getDocuments();
    for (var message in messages.documents) {
      print(message.data);
    }
  }

  void messagesStream() async {
    await for (var snapshot in _firestore.collection('messages').orderBy("created_at", descending: true).snapshots()) {
      for (var message in snapshot.documents) {
        print(message.data);
      }
    }
  }

云Firestore中的文档没有隐式排序

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

有了这样一个字段,您就可以使用orderBy按特定顺序检索文档:

await _firestore.collection('message').orderBy('timestamp').getDocuments()

云Firestore中的文档没有隐式排序

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

有了这样一个字段,您就可以使用orderBy按特定顺序检索文档:

await _firestore.collection('message').orderBy('timestamp').getDocuments()

看看这个,如果你想从firebase获取数据,可以完美地运行一个群组聊天应用程序

 class MessageStream extends StatelessWidget {


 @override

 Widget build(BuildContext context) {
 return StreamBuilder<QuerySnapshot>(

  stream: _firestore.collection("messages").orderBy("time").snapshots(),

  builder: (context, snapshot) {

    if (!snapshot.hasData) {

      return Center(
        child: CircularProgressIndicator(

          backgroundColor: Colors.amber,

        ),
      );
    }
    final messages = snapshot.data.documents.reversed;


    List<MessageBubble> messageBubbles = [];



    for (var message in messages) {

      final messageText = message.data["text"];

      final messageSender = message.data["sender"];

      final messageTime = message.data["time"];

      final currentUser = loggedInUser.email;


      final messageBubble = MessageBubble(

        sender: messageSender,

        text: messageText,

        isMe: currentUser == messageSender,

        time: messageTime,
      );
      messageBubbles.add(messageBubble);
    }
    return Expanded(

      child: ListView(

        reverse: true,
        padding: EdgeInsets.all(10),

        children: messageBubbles,
      ),
    );
  },
 );
 }
}

看看这个,如果你想从firebase获取数据,可以完美地运行一个群组聊天应用程序

 class MessageStream extends StatelessWidget {


 @override

 Widget build(BuildContext context) {
 return StreamBuilder<QuerySnapshot>(

  stream: _firestore.collection("messages").orderBy("time").snapshots(),

  builder: (context, snapshot) {

    if (!snapshot.hasData) {

      return Center(
        child: CircularProgressIndicator(

          backgroundColor: Colors.amber,

        ),
      );
    }
    final messages = snapshot.data.documents.reversed;


    List<MessageBubble> messageBubbles = [];



    for (var message in messages) {

      final messageText = message.data["text"];

      final messageSender = message.data["sender"];

      final messageTime = message.data["time"];

      final currentUser = loggedInUser.email;


      final messageBubble = MessageBubble(

        sender: messageSender,

        text: messageText,

        isMe: currentUser == messageSender,

        time: messageTime,
      );
      messageBubbles.add(messageBubble);
    }
    return Expanded(

      child: ListView(

        reverse: true,
        padding: EdgeInsets.all(10),

        children: messageBubbles,
      ),
    );
  },
 );
 }
}