Firebase Cloud Firestore 在 Flutter 中获取地图数组

Posted

技术标签:

【中文标题】Firebase Cloud Firestore 在 Flutter 中获取地图数组【英文标题】:Firebase Cloud Firestore get array of maps in Flutter 【发布时间】:2020-11-08 16:55:44 【问题描述】:

我正在尝试使用 Firebase Cloud Firestore 作为我的数据库在 Flutter 中构建一些东西。我有一个集合('students'),其中包含每个学生的文档。

在每个学生文档中都有一个数组,其中包含学生的分数图。见下文。

在 Flutter 中,我有以下课程:

class Student 
  final String name;
  final String subject;
  final List<Mark> marks;

  Student(this.name, this.subject, this.marks);


class Mark 
  final int mark;
  final String grade;
  final String markedBy;
  final String feedback;

  Mark(this.mark, this.grade, this.markedBy, this.feedback);


我正在使用 Provider 流检索数据,如下所示:

  Stream<List<Student>> get firebaseStudents 
    return Firestore.instance.collection('students').snapshots().map(_firebaseStudentsFromSnapshot);
  

  List<Student> _firebaseStudentsFromSnapshot(QuerySnapshot snapshot) 
    return snapshot.documents.map((doc) 
      return Student(
        name: doc.data['name'] ?? '',
        subject: doc.data['subject'] ?? '',

        //trying to figure out how to map the marks!

      );
    ).toList();
  

如果我打印 doc.data['grades'] 我可以看到它是一个包含数据的地图数组,我只是不确定如何将其映射到 Mark 类的列表。

我环顾四周,看到了使用 fromMap 等建议,但似乎无法使其正常工作。我已经尝试过以下方法(在 Mark 类中):

  Mark.fromMap(Map<String,dynamic> map) : 
    mark = map['mark'], 
    grade = map['grade'],
    markedBy = map['markedBy'],
    feedback = map['feedback'];

并在数据库中检索:

  marks: List<Mark>.from(doc.data['grades'].map((item) 
    return new Mark(
        mark: item['mark'],
        grade: item['grade'],
        markedBy = item['markedBy'],
        feedback = map['feedback']
       );
     )),

但无济于事。我确定我只是遗漏了一个关键部分,但我对此还是很陌生,所以我正在努力解决所有这些问题。

提前感谢您的任何帮助或建议。

编辑

最终想出了一些可行的方法,但总是很高兴听到是否有更好的方法。

我认为使用 fromMap 可能有一种更聪明的方法,但目前类型差异给我带来了问题,但我会看看我是否可以让它工作,因为这样会更整洁一些。

  List<Student> _firebaseStudentsFromSnapshot(QuerySnapshot snapshot) 
    return snapshot.documents.map((doc) 
      List<Mark> marks = [];
      List<dynamic> markMap = doc.data['grades'];
      markMap.forEach((element) 
        marks.add(new Mark(
            mark = element['mark'], 
            grade = element['grade'],
            markedBy = element['markedBy'],
            feedback = element['feedback'];
        ));
      );
      return Student(
        name: doc.data['name'] ?? '',
        subject: doc.data['subject'] ?? '',
        marks: marks,
      );
    ).toList();
  

【问题讨论】:

如果您解决了自己的问题,只需发布​​您的解决方案作为答案。无需编辑问题即可包含答案。 对不起,这个地方还是新手,不确定人们是否会有更好的解决方案。现在发布一个答案。为建议喝彩。 可以分享完整的代码,如果你还有的话,尤其是当你让它更有效的时候? @s3v3ns 恐怕我再也没有它了。只是在玩一个长期废弃的项目对不起。 【参考方案1】:

最终自己找到了解决方案,不确定它是否是最好的,但它对我有用。

  List<Student> _firebaseStudentsFromSnapshot(QuerySnapshot snapshot) 
    return snapshot.documents.map((doc) 
      List<Mark> marks = [];
      List<dynamic> markMap = doc.data['grades'];
      markMap.forEach((element) 
        marks.add(new Mark(
            mark = element['mark'], 
            grade = element['grade'],
            markedBy = element['markedBy'],
            feedback = element['feedback'];
        ));
      );
      return Student(
        name: doc.data['name'] ?? '',
        subject: doc.data['subject'] ?? '',
        marks: marks,
      );
    ).toList();
  

【讨论】:

以上是关于Firebase Cloud Firestore 在 Flutter 中获取地图数组的主要内容,如果未能解决你的问题,请参考以下文章

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

@firebase/firestore:Firestore (8.6.2):无法访问 Cloud Firestore 后端(React Js)

@firebase/firestore:Firestore (5.0.4):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应

导出 Firestore 备份数据的云功能。使用 firebase-admin 或 @google-cloud/firestore?

React Native Firebase Cloud Firestore