firebase - 当子集合在另一个小部件中接收数据时重建小部件
问题描述
我有 6 个小部件,它们都共享相同的数据,只有一个从流中接收数据
AllClasses() //显示所有的类,是从流中获取数据的开始
ClassList(data) //什么都不显示,只是构建列表视图并保存要在 classtile 小部件中显示的类的索引
ClassTile(data) //从ClassList传入的数据的索引呈现数据
ClassPage(data) //当一个classtile被点击时,这个屏幕出现
HomeworksList(data) //当点击 homeworks 按钮时转到这个小部件显示可用于点击的特定类的所有 homeworks
HomeworkTile(data) // 显示每个作业的图块
如您所见,我获取了一次数据,然后将其多次向下传递到小部件树。已经成为一个问题的是,当我显示作业列表时,它是数据来自的小部件树下的 5 个小部件,我可以选择将另一个作业添加到作业列表中。从技术上讲,将其添加到 Firestore 数据库中。
问题是,当我添加作业时,它不会刷新数据或重建任何小部件,直到我一直回到“AllClasses()”小部件。
所以重申一下,我有一个显示所有作业的小部件,在这个小部件中你可以添加一个作业,当你这样做时更新子集合,但在我回去之前不会重建显示所有作业的小部件几个小部件,首先从中获取数据
数据库架构是这样设置的:
Classes {
subcollections:
Homework {
...
}
fields:
}
也许这是我拥有数据库的方式,而我应该拥有一个超出一切的 Homeworks 集合。或者可能是因为我使用生成器未来通过使用永无止境的 while 循环来生成与流相同的东西。无论哪种方式,我对流的理解都不足以理解下一步该做什么,我从今天早上 8 点开始就一直在做这件事,并且我已经尝试了几乎所有我能做的事情。我可能只是将 Homeworks 用作单独的集合而不是子集合,问题是当我单击作业时知道我在哪个班级。
Stream<List<ClassData>> get fetchClassdata async* {
QuerySnapshot snapshot = await classesCollection.getDocuments();
// while (true) {
List<ClassData> _classList = List<ClassData>();
await Future.forEach(snapshot.documents, (element) async {
QuerySnapshot pre = await Firestore.instance
.collection("Classes")
.document(element.documentID)
.collection("Pre")
.getDocuments();
QuerySnapshot homeworksSnapshot = await Firestore.instance
.collection("Classes")
.document(element.documentID)
.collection("Homework")
.getDocuments();
QuerySnapshot notesSnapshot = await Firestore.instance
.collection("Classes")
.document(element.documentID)
.collection("Notes")
.getDocuments();
QuerySnapshot testsSnapshot = await Firestore.instance
.collection("Classes")
.document(element.documentID)
.collection("Tests")
.getDocuments();
List<Preq> _preList = List<Preq>();
List<Homework> _homeworkList = List<Homework>();
List<Note> _notesList = List<Note>();
List<Test> _testsList = List<Test>();
pre.documents.forEach((preClass) {
Preq preqData = Preq.fromMap(preClass.data);
if (preClass.data != null) {
_preList.add(preqData);
}
});
homeworksSnapshot.documents.forEach((hwork) {
Homework homeworkdata = Homework.fromMap(hwork.data);
_homeworkList.add(homeworkdata);
});
ClassData data = ClassData.fromMap(
element.data, element.documentID, _preList, _homeworkList);
if (data != null) {
_classList.add(data);
}
});
yield _classList;
// }
}
}
解决方案
推荐阅读
- mysql - 按月和多个其他字段查询聚合 EAV 记录
- xml - 为什么这个 xpath 匹配这个文本节点?
- ios - NSURLSession POST 请求 API
- python - django 循环模型查找
- elasticsearch - 将具有多个条件的 elasticsearch DSL 查询转换为 URI 搜索
- r - R - dplyr - mutate_if 多个条件
- javascript - 从引导选项卡生成 javascript 表
- mongodb - Azure 应用服务为 Docker MongoDB 映像附加虚拟磁盘
- c++ - C++ 强制在子类中实现方法但具有不同的签名
- image - 如何从 wand.image.Image 读取图像而不将其保存到驱动器