我正在使用Firebase Cloud Firestore作为数据库,在Flutter中构建一个项目。我有一个集合('students'),其中包含每个学生的文档。
在每个学生文档中,都有一个包含学生成绩映射的数组。请参见下面的示例。 在Flutter中,我有以下类:
如果我打印doc.data ['grades'],我可以看到它是一个包含数据的地图数组,我只是不确定如何将其映射到班级Mark的列表中。
我已经搜索了一下,并看到了一些建议,比如使用fromMap,但似乎无法使其工作。我已经尝试了以下内容(在Mark类中):
但是没有效果。我相信我只是缺少关键部分,但我还是比较新手,所以我正在努力理解所有这些内容。
提前感谢任何帮助或建议。
编辑
最终找到了一些可行的方法,但是如果有更好的方法,我总是很乐意听取建议。
我认为可能有一种更聪明的方法使用fromMap,但目前类型差异导致我的问题,但会看看是否可以让它正常工作,因为那会更整洁一些。
在每个学生文档中,都有一个包含学生成绩映射的数组。请参见下面的示例。 在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();
}