Получить все документы и их подколлекции - PullRequest
0 голосов
/ 01 мая 2020

Я кодирую приложение для планирования сотрудников во Flutter и использую Firestore для хранения своих данных.

У меня есть коллекция Сотрудники , в которой сохранены основные c сотрудник параметры, такие как имя, зарплата, назначение, адрес электронной почты.

Для каждого документа сотрудника у меня есть подколлекция, содержащая их недоступность. Недоступность может быть из-за того, что уже назначены на смену, болезнь, отпуск.

Для получения данных я реализовал firebase_employees_repository. В репозитории у меня есть следующая функция, которая доставляет сотрудников в режиме реального времени.

  @override
  Stream<List<Employee>> employees() {
    return employeeCollection.snapshots().map((snapshot) {
      return snapshot.documents
          .map((doc) => Employee.fromEntity(EmployeeEntity.fromSnapshot(doc)))
          .toList();
    });
  }

Теперь я хочу сделать то же самое с недоступностью.

Насколько я понимаю, список недоступности сотрудника должен сохраняться в объекте сотрудника.

Мне нужен список недоступности сотрудника, чтобы показать его статус за день / неделю / месяц. Кроме того, при создании новой смены и желании назначить сотрудника следует отображать только доступные.

Это может быть решением, но я получаю следующую ошибку:

Значение типа 'Future >>' нельзя присвоить переменной типа 'Stream >'. Попробуйте изменить тип переменной или приведите правый тип к «Stream >».

  @override
  Stream<List<Employee>> employees() {
    return employeeCollection.snapshots().map((snapshot) {
      return snapshot.documents
          .map((doc) {

            Stream<List<Unavailability>> unavailabilities = 
                employeeCollection
                .document(doc.documentID)
                .collection('Unavailabilities')
                .snapshots().map((snapshot) {
                  return snapshot.documents
                      .map((innerDoc) => Unavailability.fromEntity(UnavailabilityEntity.fromSnapshot(innerDoc)));
                }).toList()
                ;

            return Employee.fromEntity(EmployeeEntity.fromSnapshot(doc));})
          .toList();
    });
  }

Весь проект можно найти в Github по этой ссылке: schedulingapp

1 Ответ

1 голос
/ 02 мая 2020

То, что вы ожидаете и что вы возвращаете, не того же типа. Я предполагаю, что вы хотите получить поток, который Stream<List<Unavailability>. В этом случае вы можете использовать StreamTransformer для изменения типа потока из Firestore, чтобы вы могли получить то, что вы хотите. Однако я не знаю, сработает ли ваш метод, потому что вы нигде не используете unavailabilities. Более того, я не знаю, для чего UnavailabilityEntity.fromSnapshot. Предполагая, что вы пытаетесь проанализировать данные. Попробуйте использовать этот код ниже. По крайней мере, ошибка должна исчезнуть.

Stream<List<Unavailability>> unavailabilities = employeeCollection
    .document(doc.documentID)
    .collection('Unavailabilities')
    .snapshots()
    .transform<List<Unavailability>>(
  StreamTransformer.fromHandlers(
    handleData: (QuerySnapshot data, EventSink<List<Unavailability>> sink) {
      sink.add(
        data.documents.map(
              (innerDoc) => Unavailability.fromEntity(
            UnavailabilityEntity.fromSnapshot(innerDoc),
          ),
        ).toList(),
      );
    },
  ),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...