【问题标题】:Firestore/Flutter: Iterating through the ID of a collection of documents and output them as a listFirestore/Flutter:遍历文档集合的 ID 并将它们作为列表输出
【发布时间】:2021-05-04 14:30:21
【问题描述】:

我想编写一个代码,输出一个文档中每个文档的文档 ID,该文档位于 StreamBuilder 订阅的集合中。

我的 Firestore 结构是这样的:

  • 2020-2021(收藏)
    • 我的班级(文档)
      • 分数(集合)
        • 测验 1(这些是文档的文档 ID)
        • 测验 2
        • 测验 3

我的代码可能看起来很复杂,但简而言之,我想要实现的是将集合(分数)中所有文档的文档 ID 输出到列表中,而 StreamBuilder 订阅了文档收集 (MyClass) 集合。但是,它给了我这个错误:NoSuchMethodError: 'doc', method not found, Receiver: null, Arguments:[] 我想我有一个语法错误,但我不知道如何纠正它。我也不确定map方法的使用是否正确。

    classname = "MyClass";
    CollectionReference schoolYear =
      FirebaseFirestore.instance.collection("2020-2021");
    
    Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(30),
      child: StreamBuilder(
        builder: (context, streamSnapshot) {
          return SingleChildScrollView(
            child: DataTable(
              columns: streamSnapshot.data.doc.map((DocumentSnapshot document) {
                return new DataColumn(label: Text(document.id));
              }).toList(),
              rows: <DataRow>[],
            ),
          );
        },
        stream: schoolYear.doc(classname).snapshots(),
      ),
    );
  }

这是完整的错误日志(更改为 Thavamani 的代码后):

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    您当前的侦听器schoolYear.doc(classname).snapshots() 侦听对您的文档MyClass 所做的更改,并且它不包含它的子集合Scores 详细信息。

    要获取 Scores 集合中的所有文档 ID,您可以使用流/未来来获取集合中的所有可用文档。

    例如,流构建器方式

    Widget build(BuildContext context) {
        return Container(
          padding: EdgeInsets.all(30),
          child: StreamBuilder(
            builder: (context, streamSnapshot) {
               if (streamSnapshot.hasError) {
                  // print() you could check errors here
                  return Icon(
                    Icons.error_outline,
                    color: Colors.red,
                    size: 60,
                  );
               } else if (streamSnapshot.hasData) {
                   return SingleChildScrollView(
                      child: DataTable(
                      columns: streamSnapshot.data.docs.map((DocumentSnapshot document) {
                      return new DataColumn(label: Text(document.documentID));
                     }).toList(),
                    rows: <DataRow>[],
                  ),
                );
              } else {
                return SizedBox(
                     child: const CircularProgressIndicator(),
                     width: 60,
                     height: 60,
                );
            }
            stream: schoolYear.doc(classname).collection('Scores').snapshots(),
          ),
        );
      }
    
    • 如果您不想听这些文档,只需使用 collection('Scores').getDocuments() 而不是 collection('Scores').snapshots() 与未来的构建器一起使用

    【讨论】:

    • 对不起,但这仍然不起作用...我仍然收到 NoSuchMethodError:'document' 错误。我猜可能是语法有问题?
    • 现在检查所有集合名称..还有错误吗?
    • 你能分享完整的错误日志吗?具体的行会有很大帮助..
    • 已添加到帖子中。我无法粘贴整个错误日志,因为它会输出一些奇怪的字符。谢谢! (P.S. 我已经导入了 package:firebase_core/firebase_core.dartpackage:cloud_firestore/cloud_firestore.dart
    • 好的,您必须在从中获取数据之前检查快照状态。更新了我的代码。更多参考 - api.flutter.dev/flutter/widgets/StreamBuilder-class.html
    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-08-15
    相关资源
    最近更新 更多