0

因为这个错误,我快疯了。它只是在打开屏幕几分之一秒后出现,然后就消失了。每个新的应用程序安装只会出现一次此问题。

我不知道为什么它在这么短的时间内找不到文档字段,以及为什么它在这之后就可以正常工作了。

我的代码片段:

  getMembers() {
// checkField();
return StreamBuilder<QuerySnapshot> (
  ///Hier sollte eher aus den User>> Groups>> und dann den Usernamen von dem userid dokument ausgeben
  stream: FirebaseFirestore.instance
      .collection("Groups")
      .doc(widget.groupname)
      .collection("Debt")
      .snapshots(),
  builder: (ctx, streamSnapshot) {
    if (!streamSnapshot.hasData || !streamSnapshot.data!.docs.isNotEmpty) {
      return Center(
        child: CircularProgressIndicator(),
      );
    }

    final documents = streamSnapshot.data!.docs;
    return Expanded(
      child: ListView.builder(
        shrinkWrap: true,
        itemCount: documents.length ,
        itemBuilder: (ctx, index) {
          String docID = streamSnapshot.data!.docs[index].id;
          ///Ermitteln der Document ID !!!!
          return Container(
            padding: EdgeInsets.all(2),
            child: Card(
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(45),
              ),
              child: ListTile(
                title: Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: [
                    Container(
                      width: MediaQuery.of(context).size.width / 3,
                      child: Text(
                        "${documents[index]["username"]}",
                      ),
                    ),
                    
                  ],
                ),
              ),
            ),
          );
        },
      ),
    );
  },
);

}

编辑

更改扩展为一列也不起作用:S

你能告诉我为什么这个工作没有任何问题,而顶部的那个仍然显示这个错误吗?我不明白为什么它找不到数据,因为数据肯定在那里......

这是来自不同屏幕的一个,工作正常:

StreamBuilder<QuerySnapshot>(
      stream: FirebaseFirestore.instance
          .collection("Chats")
          .orderBy("createdAt", descending: true)
          .where("group", isEqualTo: widget.groupname)
          .snapshots(),
      builder: (ctx, streamSnapshot) {
        if (!streamSnapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }

        final documents = streamSnapshot.data!.docs;
        return ListView.builder(
          reverse: true,
          itemCount: documents.length,
          itemBuilder: (ctx, index) {
            String docID = streamSnapshot.data!.docs[index].id;
            return Row(
              mainAxisAlignment: documents[index]["User"] == userid
                  ? MainAxisAlignment.end
                  : MainAxisAlignment.start,
              children: [
                Container(
                  width: 300,
                  padding: EdgeInsets.symmetric(
                      vertical: 0.2, horizontal: 4),
                  child: Card(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(45)),
                    color: documents[index]["User"] == userid
                        ? Colors.grey[400]
                        : Colors.brown[300],
                    child: ListTile(
                      leading: FaIcon(FontAwesomeIcons.comment),
                      title: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            documents[index]["name"] +
                                ": " +
                                documents[index]["input"],
                          ),
                          Text(
                            "${documents[index]["Datum"]}",
                            style: TextStyle(fontSize: 10),
                          )
                        ],
                      ),
                      trailing: delete
                          ? IconButton(
                              icon: Icon(
                                Icons.delete,
                                color: Colors.red,
                              ),
                              onPressed: () async {
                                await chats.doc(docID).delete();
                              },
                            )
                          : null,
                    ),
                  ),
                ),
              ],
            );
          },
        );
      },
    ),

编辑错误堆栈:

我得到的错误

4

1 回答 1

0

StreamBuilder 触发了两次。InitialData 可能很有用。我试图添加一个更好的结构。但是if (!streamSnapshot.hasData || streamSnapshot.data!.isEmpty) { return const SizedBox(); }是为了额外的预防措施。

getMembers() {
// checkField();
  return StreamBuilder<List<Debt>>(

    ///Hier sollte eher aus den User>> Groups>> und dann den Usernamen von dem userid dokument ausgeben
    stream: FirebaseFirestore.instance
        .collection("Groups")
        .doc(widget.groupname)
        .collection("Debt")
        .snapshots().map((event) => event.docs.map((map) => Debt.fromMap(map.data())).toList()),
    initialData: const [],
    builder: (ctx, streamSnapshot) {
      if (streamSnapshot.connectionState == ConnectionState.waiting) {
        return const Center(
          child: CircularProgressIndicator(),
        );
      }
      if (!streamSnapshot.hasData || streamSnapshot.data!.isEmpty) {
        return const SizedBox();
      }
      final documents = streamSnapshot.data!;

      if (documents.isEmpty) {
        return const SizedBox();
      }

      return Expanded(
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: documents.length,
          itemBuilder: (ctx, index) {
            String docID = documents[index].id;
            final userName = documents[index]["username"];
            if(userName == null){
               return const SizedBox();
            }

            ///Ermitteln der Document ID !!!!
            return Container(
              padding: const EdgeInsets.all(2),
              child: Card(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(45),
                ),
                child: ListTile(
                  title: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      SizedBox(
                        width: MediaQuery
                            .of(context)
                            .size
                            .width / 3,
                        child: Text(
                          "$userName",
                        ),
                      ),

                    ],
                  ),
                ),
              ),
            );
          },
        ),
      );
    },
  );
}

@immutable
class Debt {
  final String id;
  final String? username;

  const Debt({required this.id, this.username});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'username': username,
    };
  }

  factory Debt.fromMap(Map<String, dynamic> map) {

    return Debt(
      id: map['id'] as String,
      username: map['username'] as String? ?? '',
    );
  }
}

于 2021-11-14T14:06:40.420 回答