提取所有文档及其子集合

时间:2020-05-01 19:49:04

标签: flutter google-cloud-firestore

我正在Flutter中编写一个员工调度应用程序,并且正在使用Firestore存储数据。

我有一个 Employees 集合,其中保存了基本的雇员参数,例如姓名,薪水,职务,电子邮件。

对于每个员工文档,我都有一个子集合,其中包含他们的不可用状态。无法使用该数据可能是由于已经分配了轮班,疾病,休假。

为了获取数据,我实现了firebase_employees_repository。在存储库中,我具有以下功能可以实时获取员工。

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

现在我要对不可用执行相同的操作。

据我了解,员工的不可用列表应保存在employee对象内。

我需要一个雇员的不可用列表,以显示其每天/每周/每月的状态。另外,在创建新班次并希望分配给员工时,应仅显示可用职位。

这可能是一种解决方案,但出现以下错误:

类型为'Future >>的值不能为 分配给类型为'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 个答案:

答案 0 :(得分:1)

您期望和返回的内容不是同一类型。我假设您要接收的是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(),
      );
    },
  ),
);