【问题标题】:StreamBuilder snapshot has no data FlutterStreamBuilder 快照没有数据 Flutter
【发布时间】:2021-07-01 05:19:22
【问题描述】:

我查看了一些类似的问题,但没有找到我要查找的内容。 我有一个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 的信息,我会很乐意倾听,但显然这是一个加分项。

【问题讨论】:

  • 如果在if (snapshot.hasData) { 之前调用print(snapshot);,你会看到什么?
  • FirebaseFirestore.instance.collection("${sender.id}/chats'") 假设这就是您将 collectionReference 构造为 chats 子集合的方式吗?
  • @pskink 我看到了:颤振:AsyncSnapshot(ConnectionState.none, null, null, null)
  • ConnectionState.none 没有别的?如果是这样,那么widget.database.streamChats(widget.user) 不会发出任何数据
  • @pskink 不,只有我之前写的,没有和一些空字段

标签: firebase flutter google-cloud-firestore stream-builder


【解决方案1】:

已解决,问题出在 Stream,我没有返回正确的,但使用 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();
  }

【讨论】:

    【解决方案2】:

    您需要从您的流中创建 ChatCard 对象,假设您希望它们在一个列表中,因为您将获得一个 docs 列表,然后返回它们。

    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");
      }
    

    【讨论】:

    • 是的,我稍后会这样做,但正如 pskink 所说,我的流不会发出任何数据......也许这是主要问题
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 2023-03-29
    • 2021-11-17
    • 2020-04-16
    • 2020-07-19
    • 2021-01-21
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多