Flutter 异步等待无法正常运行

Flutter async await not functioning in order

我正在做一个项目,让员工将物品扫描到垃圾箱中。我正在尝试从数据库加载信息。我查看了许多不同的帖子并发现了相似的东西,但从来没有任何有用的东西。

我有一个要向其中添加数据的列表 (binListDBList),然后我想用它做一些事情。我确实得到了响应,它是正确的数据,但我必须进行定时延迟而不是等待。它很笨重,我想知道更好的解决方案是什么。

我已经尝试了 async/await 和 .then,但到目前为止没有任何效果。我知道有一个解决方案,但我花了很多时间却没有得到任何结果。

我添加了一堆打印语句用于测试。

启动方式:

Future<void> loadBinListFromDB(String empID, String binName) async {
  print("start");
  DatabaseService.binListDBList.clear();
  print("Zero: " + DatabaseService.binListDBList.toString());


  await DatabaseService().getBinList(empID, binName);

  print("test");

  if (DatabaseService.binListDBList.isEmpty) {
    print("No Data");
  } else {
    print("data");
  }
  print("Fifth: " + DatabaseService.binListDBList.toString());

  Future.delayed(new Duration(seconds: 1)).then((value) {
    print("last: " + DatabaseService.binListDBList.toString());
  });

  print(DatabaseService.binListDBList);
  return;
}

数据库服务class

static List<BinListDB> binListDBList = [];

Future<void> getBinList(String employeeID, String binName) async {
    print(employeeID);

    List<BinListDB> hold = [];
    print("First: $binListDBList");
    binListCollection
        .doc(employeeID)
        .collection(binName)
        .snapshots()
        .forEach((element) {
      for (int i = 0; i < element.docs.length; i++) {
        hold.add(BinListDB.fromFireStore(element.docs[i]));
      }
      print("Second: $binListDBList");
      binListDBList = hold;
      print("Third: $binListDBList");
    });
    print("Fourth: $binListDBList");
    return;

  }

输出:

I/flutter (26448): start
I/flutter (26448): Zero: []
I/flutter (26448): EmployeeID
I/flutter (26448): First: []
I/flutter (26448): Fourth: []
I/flutter (26448): test
I/flutter (26448): No Data
I/flutter (26448): Fifth: []
I/flutter (26448): finish
I/flutter (26448): Second: []
I/flutter (26448): Third: [Instance of 'BinListDB']
I/flutter (26448): last: [Instance of 'BinListDB']

我不明白为什么它没有按顺序打印。

非常感谢任何帮助,感谢阅读。

您目前正在做:

    binListCollection
        .doc(employeeID)
        .collection(binName)
        .snapshots()
        .forEach((element) {
      ...
    });

snapshots() returns a Stream, which is asynchronous. You call Stream.forEach 遍历 Stream 的每个元素,Stream.forEach returns 一个 Future 来指示它何时完成,但您忽略了awaitFuture。因此,Stream.forEach 的调用者会立即继续执行,您会看到在 Stream.forEach 的回调打印“第二”和“第三”之前打印了“第四”(随后是“第五”和“完成”)。

即需要修改为:

    await binListCollection
        .doc(employeeID)
        .collection(binName)
        .snapshots()
        .forEach((element) {
      ...
    });

我强烈建议启用 unawaited_futures lint 让分析器捕获此类错误。