StreamBuilder 快照没有数据 Flutter

StreamBuilder snapshot has no data Flutter

我查看了一些类似的问题,但没有找到我要找的内容。 我有一个 StreamBuilder 的快照没有数据,但如果我查看它正在侦听的集合内部,我可以看到有 2 个文档。

这是我第一次使用 StreamBuilder,所以我可能缺少一些基本规则。 我说它 has no data 因为它总是显示 "No chats here".

这是代码(后面的流函数):

StreamBuilder<ChatCard>(
        stream: widget.database.streamChats(widget.user),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return Container(
              child: Text(
                "There's something here!",
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            );
          } else {
            return Container(
              child: Text(
                "No chats here",
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            );
          }
        },
      ),

这是流函数,有一些额外的检查,因为我试图弄清楚什么不起作用,顺便说一下,try 块中似乎没有错误,也没有 if 违反声明:

Stream<ChatCard> streamChats(MyUser sender) {
    if (sender != null) {
      if (sender.id != null) {
        try {
          FirebaseFirestore.instance
              .collection("ids/tabs/${sender[0].toLowerCase()}/${sender.toLowerCase()}/chats")
              .snapshots();
          print(
              "ids/tabs/${sender[0].toLowerCase()}/${sender.toLowerCase()}/chats'");
        } on FirebaseException catch (e) {
          print(e);
        } catch (e) {
          print(e);
        }
      } else
        print("Sender ID null");
    } else
      print("Sender null");
  }

如果你也能给我提供一些关于 StreamBuilderStream 的一般信息,我会很乐意倾听,但显然这是一个加号。

您需要从您的流中创建 ChatCard 个对象,假设您希望它们在列表中,因为您正在获取 docs 和 return 个对象的列表。

Stream<List<ChatCard>> streamChats(MyUser sender) {
List<ChatCard> chatCardList=[];

    if (sender != null) {
      if (sender.id != null) {
        try {
         return await FirebaseFirestore.instance
              .collection("${sender.id}/chats'")
              .snapshots().then((snap){
           for(var item in snap.data.docs){
             chatCardList.add(ChatCard.fromMap(snap.data));}
          return chatCardList; });
          print(
              "${sender.id}/chats'");
        } on FirebaseException catch (e) {
          print(e);
        } catch (e) {
          print(e);
        }
      } else
        print("Sender ID null");
    } else
      print("Sender null");
  }

已解决,问题出在流上,我没有返回正确的流,但是 QuerySnapshot 它可以工作:

Stream<QuerySnapshot> streamChats(User sender) {
    return FirebaseFirestore.instance
        .collection("ids")
        .doc("tabs")
        .collection(sender.id[0].toLowerCase())
        .doc(sender.id[0].toLowerCase())
        .collection("chats")
        .snapshots();
  }