【发布时间】:2021-08-16 22:44:41
【问题描述】:
我正在尝试将 List 或 Map 添加到我的 Firestore,但它似乎不起作用。
它不工作的原因是因为在我可以为Map 赋值并将其添加到我的List 之前,正在调用Firestore 的写入函数。问题似乎出在async await 我想,但我看不出代码有什么问题。
这是我用来添加订单请求的函数
Future<String> addOrder(
DateTime startTime,
DateTime endTime,
CartItem cartProduct,
double total,
String restName,
String restLocation,
) async {
var userId = FirebaseAuth.instance.currentUser.uid;
final timestamp = DateTime.now();
String error = '';
String restError = '';
String id;
List<Map<String, dynamic>> restItemsMap = [];
try {
await FirebaseFirestore.instance
.collection('users/$userId/orders')
.add(
{
'amount': total,
'dateTime': timestamp.toIso8601String(),
'restaurantName': cartProduct.restaurantName,
'restaurantLocation': restLocation,
'startTime': startTime,
'restaurantId': cartProduct.id,
'status': OrderStatus.Pending.toString(),
'endTime': endTime,
},
)
.then((value) => id = value.id)
.catchError((error) {
print('Error adding new order initialization: $error');
return error.toString();
});
cartProduct.restaurantItems.forEach(
(restItem) async {
// print('ordered item: ${cp}');
await FirebaseFirestore.instance
.collection('users')
.doc(userId)
.collection('orders')
.doc(id)
.collection('items')
.doc(restItem.id)
.set(
{
'name': restItem.name,
'quantity': restItem.quantity,
'price': restItem.price,
},
).catchError((error) {
print('Adding rest items initialization: $error');
return error.toString();
});
},
);
/// RESTAURANT REQUEST
cartProduct.restaurantItems.forEach(
(element) async {
Map<String, dynamic> restItemMap = {};
final restData = await FirebaseFirestore.instance
.collection('restaurants')
.doc(cartProduct.id)
.collection('restaurantItems')
.doc(element.id)
.get()
.catchError((error) {
print('adding rest item error: $error');
return error.toString();
});
if (restData.data()['quantity'] - element.quantity >= 0) {
restItemMap = {
'id': element.id,
'name': element.name,
'quantity': element.quantity,
'price': element.price,
};
restItemsMap.add(restItemMap);
print('REST MAP: $restItemMap');
} else {
return 'OUT_OF_STOCK';
}
},
);
print('REST ARRAY MAP: $restItemsMap');
await FirebaseFirestore.instance
.collection('restaurants')
.doc(cartProduct.id)
.collection('orderRequests')
.doc(id)
.set({
'startTime': startTime,
'endTime': endTime,
'amount': total,
'dateTime': timestamp.toIso8601String(),
'orderId': id,
'status': OrderStatus.Pending.toString(),
'items': restItemsMap,
}).catchError((error) {
print('adding rest item error: $error');
return error.toString();
});
notifyListeners();
return 'SUCCESS';
} catch (error) {
print(error);
return 'ERROR';
}
}
print('REST ARRAY MAP: $restItemsMap'); 语句在 print('REST MAP: $restItemMap'); 之前被调用
这是我得到的输出:
颤动:REST 数组映射:[]
flutter: REST MAP: {id:bcUM4KmfqCdZ2ffafPDT, name: Donut Meal, 数量: 1, price: 50.0}
【问题讨论】:
标签: firebase flutter dart async-await