我正在尝试使用Firebase Cloud Firestore作为数据库在Flutter中构建一些东西。我有一个集合(“学生”),其中包含每个学生的文件。
每个学生文档中都有一个数组,其中包含该学生的标记图。见下文。
Firebase Cloud Firestore在Flu中获取 map 阵列-LMLPHP
在Flutter中,我有以下类(class):

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

我正在使用提供程序流检索数据,如下所示:
  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();
  }

最佳答案

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

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

10-02 03:53