【问题标题】:Error adding List of Map to Firebase: Flutter将地图列表添加到 Firebase 时出错:Flutter
【发布时间】:2021-08-16 22:44:41
【问题描述】:

我正在尝试将 ListMap 添加到我的 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


    【解决方案1】:

    异步调用不会在 forEach 循环中工作。它们将被执行,但您的代码将在不等待它们的情况下通过循环。这就是您看到这种行为的原因。

    最好的解决方案是将数据存储到一个数组中并使用for in 循环,async 将按预期工作。

    Here 与您的问题类似,有一个解决方案示例。

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2020-07-21
      • 2023-01-13
      • 2019-10-11
      • 2020-07-26
      • 1970-01-01
      相关资源
      最近更新 更多