首页 > 解决方案 > Flutter Firestore 返回 Future> 返回空

问题描述

我有一个函数可以检索数据列表作为未来。

final CollectionReference _departmentHoursCollection =
  FirebaseFirestore.instance.collection('departmentsHours');

Future<List<DepartmentHour>> isUnfinishedGK(List<String> sites) async {
    sites.asMap().forEach((key, value) async {
      QuerySnapshot departmentsHoursSnapshot = await _departmentHoursCollection
          .where('siteName', isEqualTo: value)
          .where('justification', isEqualTo: 'working')
          .get();
      if (departmentsHoursSnapshot.docs.isNotEmpty) {
        departmentsHoursSnapshot.docs.asMap().forEach((key, value) async {
          var document = await value.reference.get();
          print(document.data());
          _temporal.add(DepartmentHour.fromMap(document.data()));
        });
      }
    });
    print("size: ${_temporal.length}");
    return _temporal;
  }

但是,当我最后打印尺寸时,它一直显示:

I/颤振(20592):大小:0

但是正在获取数据并将其添加到变量中:_temporal

I/flutter (20592): {globalTime: 24304, endHour: 06:00, startedTime: Timestamp(seconds=1602329908, nanoseconds=453000000), departmentHourDetails: [{globalTime: 24300, endJobTime: Timestamp(seconds=1602354212, nanoseconds=456000000) ), 部门: Grind Room, startJobTime: Timestamp(seconds=1602329911, nanoseconds=766000000)}, {globalTime: 24299, endJobTime: Timestamp(seconds=1602354212, nanoseconds=456000000), department: Main Production, startJobTime: Timestamp(seconds= 1602329913, nanoseconds=94000000)}], startHour: 22:00, scheduleDate: Timestamp(seconds=1602306000, nanoseconds=0), finishedTime: Timestamp(seconds=1602329908, nanoseconds=453000000), siteName: SMD, justification: working}

任何人都知道如何使用获取的数据返回列表,而不是返回 []。

标签: flutterdart

解决方案


要解决这个问题,您可以使用Future.forEach(),它会等待每个 Future 完成,然后再移动到下一个元素,如您在此处看到的。

例子:

Future<List<String>> myFuture(List<String> names) async {
  List<String> newNames = [];

  await Future.forEach(names, (name) async {
    await Future.delayed(Duration(seconds: 2), () {
      newNames.add(name);
    });
  });

  return newNames;
}

推荐阅读