I recently was trying to do something like this,
NOTE: Focus on the print statements.
List shipped = [], pending = [], completed = [], returned = [];
List<OrderModel> mainOrdersList = [];
@override
void initState() {
super.initState();
getData();
}
Future getData() async {
var results = await DatabaseHandler().fetchOrders("merchantId");
results.docs.forEach((f) async {
var products = await DatabaseHandler().fetchOrderedProducts(f.id);
var productData = products.data();
//add to mainOrdersList
print("mainOrderList Length - ${mainOrdersList.length}");
});
//THE BELOW STATEMENT IS BEING EXCECUTED BEFORE THE COMPLETION OF THE FOR LOOP GIVEN ABOVE
segregate();
setState(() {});
}
void segregate() {
print("segregating");
for (int i = 0; i < mainOrdersList.length; i++) {
mainOrdersList[i].productList.forEach((element) {
//segregate on the basis of status like pending, shipped, completed, returned
});
}
}
OUTPUT WITH FOREACH -
segregating
mainOrdersList Length - 10
Even though I am using await
in forEach, still the statement below the forEach is being exceuted first. But if I use simple for loop, this doesn't happen and the code works perfectly as it should.
Replacing forEach
with for
,
for (int i = 0; i < results.docs.length; i++) {
var f = results.docs[i].data();
var products = await DatabaseHandler().fetchOrderedProducts(f.id);
var productData = products.data();
//add to mainOrdersList
print("mainOrderList Length - ${mainOrdersList.length}");
}
OUTPUT WITH SIMPLE FOR -
mainOrdersList Length - 10
segregating
And I also observed that forEach
was a bit faster than for
.