将地图列表添加到 Firebase 时出错:Flutter

Posted

技术标签:

【中文标题】将地图列表添加到 Firebase 时出错:Flutter【英文标题】:Error adding List of Map to 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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于将地图列表添加到 Firebase 时出错:Flutter的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 Android Studio 添加 Firebase 项目时出错

将数据从 FireBase 检索到颤振项目时出错

运行 Gradle 时出错 - gradlew.bat 异常退出(添加 firebase 后出错)

Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)

如何将谷歌地图标记的纬度和经度发送到 Firebase - android? [关闭]

将 firebase 数据放入 recyclerview 时出错,“反序列化时需要一个列表,但有一个类 java.lang.String”