【问题标题】:Flutter Firebase getting list of documentFlutter Firebase 获取文档列表
【发布时间】:2021-12-02 06:35:13
【问题描述】:

当我想获取数据作为对象列表时

 onPressed: () {
     print("entered");
     ProductServices _productServives = ProductServices();
     Future<List<dynamic>> plist = _productServives.getProducts2();
     print(plist);
  },
Future<List<dynamic>> getProducts2() async {
    CollectionReference ref = _firestore.collection('Products');
    List<Product> productsArray = [];

    ref.snapshots().forEach((element) {
      element.docs.forEach((value) {
        var p = Product.fromSnapshot(value);
        productsArray.add(p);
        print("size: " + productsArray.length.toString());
      });
      // productsArray.add(element);
    });
    print("+ size: " + productsArray.length.toString());

    return productsArray;
  }

它没有像我想要的那样逐行工作。 在为每个将元素放入列表并增加大小但由于工作队列返回列表为空。

我该如何解决这个问题,我在哪里可以研究异步操作。

输出:

I/flutter (29128): entered
I/flutter (29128): + size: 0
I/flutter (29128): Instance of 'Future<List<dynamic>>'
I/flutter (29128): size: 1
I/flutter (29128): size: 2
I/flutter (29128): size: 3

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    我解决了这样的问题编码

    await ref.snapshots().first.then((value) => {
              value.docs.forEach((element) {
                print(element.id);
                var p = Product.fromSnapshot(element);
                productsArray.add(p);
              })
            });
    

    【讨论】:

      【解决方案2】:

      由于您已经将函数标记为async,您可以在其中使用await 来稍微掩盖异步性:

      Future<List<dynamic>> getProducts2() async {
        CollectionReference ref = _firestore.collection('Products');
        List<Product> productsArray = [];
      
        var snapshots = await ref.get()
        snapshots.forEach((element) {
          element.docs.forEach((value) {
            var p = Product.fromSnapshot(value);
            productsArray.add(p);
            print("size: " + productsArray.length.toString());
          });
        });
        print("+ size: " + productsArray.length.toString());
      
        return productsArray;
      }
      

      要了解更多关于 Future 和 Flutter 中的 async/await 的信息:https://www.google.com/search?q=futures%2C+and+async%2Fawait+in+Flutter。事实上,我会将该搜索中的第一个 video 添加到我的播放列表中,因为 Andrew 是一位出色的解释者。

      【讨论】:

      • 等待时的结果相同我收到此警告'await' 应用于'Stream>>',这不是'未来'
      • ``` await snapshots.forEach((element)``` 尝试这样做,但在这种情况下,函数永远不会结束
      • 啊,我错过了那里的snapshots()。该新错误的解决方案是使用get() 而不是snapshotsget() 函数返回一个Future&lt;QuerySnapshot&gt;(您可以在其上调用await),而snapshots() 返回一个Stream&lt;QuerySnapshot&gt;,您必须对其进行listen() 或(如您的自我回答)调用first(),但在这种情况下,您将获得与 get() 相同的回报,但同时浪费了更多资源。
      猜你喜欢
      • 2021-04-21
      • 2020-08-10
      • 2021-11-19
      • 2020-11-05
      • 2020-11-02
      • 2021-07-10
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      相关资源
      最近更新 更多