【问题标题】:Cannot save Firestore query in a list无法将 Firestore 查询保存在列表中
【发布时间】:2021-04-25 16:25:40
【问题描述】:

基本上我需要将一个集合的字段保存在一个列表中。

这是负责连接到数据库的小部件:

  Future<QuerySnapshot> MissionRetriever1() async{
    await FirebaseFirestore.instance
        .collection("quest")
        .doc("1")
        .get();
    }

这是另一个文件中包含的小部件,负责将各种数据保存在列表中:

  Future<void> getMission1() async{
   var snap = await widget.mservice.MissionRetriever1();
   for(var doc in snap.docs){
     MissionData1.add(doc.data()['Q_Category']);
     MissionData1.add(doc.data()['Q_Name']);
     MissionData1.add(doc.data()['Q_Description']);
     MissionData1.add(doc.data()['Q_Score']);
     MissionData1.add(doc.data()['Q_Target']);
   }
  }

但是当我尝试在这样的 Text 小部件中的 List 内显示一个值时:

Text(MissionData1 == null ?  "Loading..." : MissionData1[1],
                                      style: TextStyle(
                                          fontWeight: FontWeight.bold,
                                          fontFamily: 'Roboto',
                                          color: const Color(0xFF3A404C),
                                          fontSize: 14.0.sp),),

他告诉我列表中没有值:RangeError(index): Invalid value: Valid value range is empty: 1

这是 Firestore 集合:

【问题讨论】:

    标签: flutter google-cloud-firestore flutter-layout flutter-dependencies flutter-test


    【解决方案1】:

    你没有从MissionRetriever1()返回快照,所以var snap基本上等于没有。

    这样做:

    Future<DocumentSnapshot> MissionRetriever1() async{
        await FirebaseFirestore.instance
            .collection("quest")
            .doc("1")
            .get();
        }
    
    Future<void> getMission1() async{
       DocumentSnapshot snap = await widget.mservice.MissionRetriever1();
       Map<String,dynamic> data = snap.data();
       MissionData1.add(data['Q_Category']);
       MissionData1.add(data['Q_Name']);
       MissionData1.add(data['Q_Description']);
       MissionData1.add(data['Q_Score']);
       MissionData1.add(data['Q_Target']);
       }
      }
    

    【讨论】:

    • 返回此错误 没有为类型“DocumentSnapshot”定义 getter 'docs'。尝试导入定义“docs”的库,将名称更正为现有 getter 的名称,或定义名为“docs”的 getter 或字段。
    • 是的,我的错,这是一个单一的文档,所以你不需要循环浏览它。 .docs 用于 CollectionReference。我更新了答案
    • RangeError(index):无效值:有效值范围为空:0
    • 你在哪里得到这个错误。根据数据库的屏幕截图,代码必须工作。错误可能来自代码的其他部分
    【解决方案2】:
    Future<QuerySnapshot> MissionRetriever1() async{
    QuerySnapshot querySn = await await FirebaseFirestore.instance
        .collection("quest")
        .get();
    return querySn;}
    

    然后 querySn.docs 将返回一个 DocumentSnapshot 列表。另外,您的列表可能是 [] 而不是 null 并且您尝试获取第一个元素,但没有一个

    【讨论】:

    • 不,因为“DocumentSnapshot”类型的值无法分配给“QuerySnapshot”类型的变量。
    猜你喜欢
    • 2021-04-21
    • 2020-09-28
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多