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
来指示它何时完成,但您忽略了await
即 Future
。因此,Stream.forEach
的调用者会立即继续执行,您会看到在 Stream.forEach
的回调打印“第二”和“第三”之前打印了“第四”(随后是“第五”和“完成”)。
即需要修改为:
await binListCollection
.doc(employeeID)
.collection(binName)
.snapshots()
.forEach((element) {
...
});
我强烈建议启用 unawaited_futures
lint 让分析器捕获此类错误。
我正在做一个项目,让员工将物品扫描到垃圾箱中。我正在尝试从数据库加载信息。我查看了许多不同的帖子并发现了相似的东西,但从来没有任何有用的东西。
我有一个要向其中添加数据的列表 (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
来指示它何时完成,但您忽略了await
即 Future
。因此,Stream.forEach
的调用者会立即继续执行,您会看到在 Stream.forEach
的回调打印“第二”和“第三”之前打印了“第四”(随后是“第五”和“完成”)。
即需要修改为:
await binListCollection
.doc(employeeID)
.collection(binName)
.snapshots()
.forEach((element) {
...
});
我强烈建议启用 unawaited_futures
lint 让分析器捕获此类错误。