首页 > 解决方案 > 当子集合在另一个小部件中接收数据时重建小部件

问题描述

我有 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;
    // }
  }
}

标签: firebaseflutterdartflutter-provider

解决方案


推荐阅读