【问题标题】:How to get Firestore data from documents of different collections如何从不同集合的文档中获取 Firestore 数据
【发布时间】:2021-08-08 18:59:53
【问题描述】:

我正在尝试从不同集合的不同文档中收集数据,并且在 for 循环中这样做会增加代码处理时间

 for (var i = 0; i < productDataList.length; i++) {
      // Get full data according to shared preferences
      var firestore = FirebaseFirestore.instance;
      DocumentSnapshot ds1 = await firestore
          .collection('products')
          .doc(productDataList[i][4])
          .collection(productDataList[i][4])
          .doc(productDataList[i][0])
          .get();

      // Add product DocumentSnapshot to map
      productFullDetails.add({'productDoc': ds1});
}

有谁知道更好的方法来做到这一点? 谢谢。

【问题讨论】:

  • 什么会使另一种方法更适合您?那么:您当前的代码有什么问题?
  • @FrankvanPuffelen 这需要时间来加载

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

您可以通过创建异步操作 Futures 的列表并使用 Future.wait 一次获取所有结果来将异步操作移出 for 循环。

  var firestore = FirebaseFirestore.instance;

  final List<Future<DocumentSnapshot>> documentSnapshotFutureList =
      productDataList
          .map((productData) => firestore
              .collection('products')
              .doc(productDataList[i][4])
              .collection(productDataList[i][4])
              .doc(productDataList[i][0])
              .get())
          .toList();

  final List<DocumentSnapshot> documentSnapshotList = await Future.wait(documentSnapshotFutureList);

  productFullDetails = documentSnapshotList
      .map((DocumentSnapshot documentSnapshot) =>
          {'productDoc': documentSnapshot})
      .toList();

注意以下使用Future.wait

返回一个future,一旦所有提供的futures完成 已完成,无论是结果还是错误(如果有) 提供的期货失败。

返回的未来值将是一个列表 是按照通过迭代提供期货的顺序产生的 期货

https://api.flutter.dev/flutter/dart-async/Future/wait.html

【讨论】:

    【解决方案2】:

    问题不是由 for 循环本身引起的,请查看 for 循环中发生的情况。如果您发出异步网络请求并等待它。如果您有一个 100 项长的产品列表,您必须提出 100 个请求,并等待每个请求完成。如果每个请求都是 200 毫秒[这并不慢],那就是 20 秒。

    我可能会跳过在 for 循环中执行此操作,并使用流构建器自行获取流中的每个文档,这在技术上是相同的读取量。

    使用你的 for 循环创建一个蒸汽,伪代码将如下所示:

    Column(
     children:[
      for (var product in productDataList) 
        
       StreamBuilder<DocumentSnapshot>(
       stream: FirebaseFirestore.instance
              .collection('products')
              .doc(product[4])
              .collection(product[4])
              .doc(product[0])
              .snapshots(),
       builder: (context, snapshot){
      if(snapshot.hasData) productFullDetails.add({'productDoc': snapshot.data() as Map<String,dynamic>});
    return Text('something');
    
       }
       
    )
    
     ])
    

    这将同时获取您的数据,而无需等待它们一个接一个地完成。

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 1970-01-01
      • 2021-11-04
      • 2023-03-03
      • 1970-01-01
      • 2018-04-04
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多