【问题标题】:no value from firebase firestore when using orderBy() in flutter在颤振中使用 orderBy() 时,firebase firestore 没有任何值
【发布时间】: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


【解决方案1】:

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

然后选择创建索引

【讨论】:

  • 但它需要两个字段,我只需要访问“时间戳”字段...我在另一个字段的帮助下创建了索引,但同样的错误即将到来(文档没有价值) ..
  • 它将提供两个链接跟随两者并点击创建索引
  • 链接在哪里?
  • 在你的颤动日志中它会生成一个链接,看看我的答案
猜你喜欢
  • 2021-03-26
  • 2018-12-04
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2019-06-04
  • 2021-04-18
  • 2021-04-18
  • 2020-07-11
相关资源
最近更新 更多