83/5000 Запросите вложенные коллекции Firebase и дождитесь загрузки всех данных - PullRequest
0 голосов
/ 09 марта 2020

Стартовая ситуация:
Мой проект содержит в общей сложности 4 коллекции Firebase.
1. Коллекция под названием "выставочный день" содержит несколько документов, каждый из которых содержит коллекцию под названием "тема".
2. Коллекция «theme» содержит документы, каждый из которых содержит «block» коллекции.
3. Документы в «theme» коллекции, в свою очередь, содержат коллекцию «programitem».

Я использую следующие четыре метода для получения в моем проекте флаттера на каждый день их тем, блоков и элементов программы.

  Future<List<ExhibitionDay>> fetchExhibitionDays() async {
    try {
      var result = await _exhibitionDayCollection
          .orderBy('date', descending: false)
          .getDocuments();

      return result.documents.map((doc) {
        ExhibitionDay day =
            ExhibitionDay.fromEntity(ExhibitionDayEntity.fromSnapshot(doc));
        day.docRef = doc.reference;
        return day;
      }).toList();
    } catch (error) {
      print('Error: $error');
    }
  }

  Future<List<Theme>> fetchThemesOfDay(DocumentReference docRef) async {
    try {
      var result = await docRef
          .collection('theme')
          .orderBy('index', descending: false)
          .getDocuments();

      return result.documents.map((doc) {
        Theme theme = Theme.fromEntity(ThemeEntity.fromSnapshot(doc));
        theme.docRef = doc.reference;
        return theme;
      }).toList();
    } catch (error) {
      print('Error: $error');
    }
  }

  Future<List<Block>> fetchBlocksOfTheme(DocumentReference docRef) async {
    try {
     var result = await docRef
         .collection('block')
         .orderBy('starttime', descending: false)
         .getDocuments();

     return result.documents.map((doc) {
       Block block = Block.fromEntity(BlockEntity.fromSnapshot(doc));
       block.docRef = doc.reference;
       return block;
     }).toList();
    } catch(error) {
      print('Error: $error');
    }
  }

  Future<List<ProgramItem>> fetchProgramitemOfBlock(DocumentReference docRef) async {
    try {
     var result = await docRef
         .collection('programItem')
         .orderBy('starttime', descending: false)
         .getDocuments();

     return result.documents.map((doc) {
       ProgramItem item = ProgramItem.fromEntity(ProgramItemEntity.fromSnapshot(doc));
       item.docRef = doc.reference;
       return item;
     }).toList();
    } catch(error) {
      print('Error: $error');
    }
  } 

Что я могу сделать после вызова метода "fetchExhibDaysDays «Мое приложение ожидает загрузки всех документов других (под) коллекций. Другими словами, полное дерево данных считывается. До сих пор все мои попытки приводили к исключению типа

Необработанное исключение: NoSuchMethodError: Метод '[]' был вызван с нулевым значением

, поскольку не все данные были загружен еще.

    ProgramRepo repo = new ProgramRepo();
    List<ExhibitionDay> days;
    repo.fetchExhibitionDays().then((values) {
      days = values;
      days.forEach((day) {
        repo.fetchThemesOfDay(day.docRef).then((values) {
          day.themes = values;
          day.themes.forEach((theme) {
            repo.fetchBlocksOfTheme(theme.docRef).then((values) {
              theme.block = values;
              theme.block.forEach((block) {
                repo.fetchProgramitemOfBlock(block.docRef).then((values) {
                  block.programItems = values;
                });
              });
            });
          });
        });
      });
    });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...