StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false

Posted

技术标签:

【中文标题】StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false【英文标题】:StreamBuilder always returning false in print(snapshot.hasData) in flutter 【发布时间】:2021-09-10 21:20:30 【问题描述】:

我会在 flutter 中显示来自 firebase firestore 的消息,但是当我在快照中设置条件时总是返回 false 这是我的代码

服务

Stream<List<MessageModel>> getMessagesByUserid(int userId) 
    try 
      return firestore
          .collection('messages')
          .where('userId', isEqualTo: userId)
          .snapshots()
          .map((QuerySnapshot list) 
        var result = list.docs.map<MessageModel>((DocumentSnapshot message) 
          print('from service : ' + message.data().toString());
          return MessageModel.fromJson(message.data());
        ).toList();

        result.sort(
          (MessageModel a, MessageModel b) =>
              a.createdAt.compareTo(b.createdAt),
        );
        return result;
      );
     catch (e) 
      throw Exception(e);
    
  

并用这个调用

 Widget content() 
      return StreamBuilder<List<MessageModel>>(
          stream: MessageService()
              .getMessagesByUserid(userId: authprovider.user.id),
          builder: (context, snapshot) 
            print(snapshot.hasData);
            if (snapshot.hasData) 
              return ListView(
                padding: EdgeInsets.symmetric(
                  horizontal: defaultMargin,
                ),
                children: snapshot.data
                    .map(
                      (MessageModel message) => ChatBubble(
                        isSender: message.isFromUser,
                        text: message.message,
                        product: message.product,
                      ),
                    )
                    .toList(),
              );
             else 
              return Center(
                child: CircularProgressIndicator(),
              );
            
          );
    

当我在服务中打印时,我得到

I/flutter (29881): from service : createdAt: 2021-06-28 16:29:25.106709, product: , userImage: https://ui-avatars.com/api/?name=eka&color=7F9CF5&background=EBF4FF, isFromUser: true, message: tanpa, userName: eka, userId: 2, updatedAt: 2021-06-28 16:29:25.106811

但是当我打印时(snapshot.hasData)总是返回假

I/flutter (29881): false

【问题讨论】:

在服务中将 Stream 更改为 Future 您的 getMessagesByUserid 代码可能会抛出错误.....所以在 catch 块中也返回一些东西来查看 检查snapshot.connectionState'而不是snapshot.hasData。 connectionState 可以是等待、无、活动或完成,hasData 仍然可以是falseStream 正在返回null 【参考方案1】:

如果您在使用StreamBuilder 时需要更多粒度,请测试snapshot.connectionState 而不是snapshot.hasData

如果 Stream 返回 null,snapshot.hasData 仍然可以为 false

【讨论】:

以上是关于StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 StreamBuilder 卡在 ConnectionState.waiting 中并且只显示加载标记

Flutter Streambuilder 正在复制项目

在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行

Flutter:将firestore快照转换为streambuilder中的列表

如何在flutter中从streambuilder导航到其他页面?

Flutter:Streambuilder - 关闭流