在颤振中使用 orderBy() 时,firebase firestore 没有任何值

Posted

技术标签:

【中文标题】在颤振中使用 orderBy() 时,firebase firestore 没有任何值【英文标题】:no value from firebase firestore when using orderBy() in flutter 【发布时间】: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中写一个索引,有时会在控制台中显示为链接 【参考方案1】:

您必须在 firebase 控制台中创建索引,flutter 会在您的日志中提供链接:

然后选择创建索引

【讨论】:

但它需要两个字段,我只需要访问“时间戳”字段...我在另一个字段的帮助下创建了索引,但同样的错误即将到来(文档没有价值) .. 它将提供两个链接跟随两者并点击创建索引 链接在哪里? 在你的颤动日志中它会生成一个链接,看看我的答案

以上是关于在颤振中使用 orderBy() 时,firebase firestore 没有任何值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 颤振应用程序中合并两个集合?

列表为空(颤振)

使用颤振(Windows)应用程序进行firebase匿名登录时出现MissingPluginException异常

如何在后台监听firebase实时数据库更新事件并使用颤振自动启动应用程序(如Messenger中的调用功能)?

在颤振中使用列表视图搜索数据时出错

在颤振中使用提供者时,getter 被调用为 null