【问题标题】:Adding list items in a Future in flutter returns no items在 Flutter 中的 Future 中添加列表项不返回任何项
【发布时间】:2021-02-05 16:26:46
【问题描述】:

在颤振中,我从 firebase 数据库中读取了两次。 第一个代码读取在数组中找到的文档的所有引用。 下一个代码遍历所有引用并在 firebase 中加载该引用的文档数据。 当我调试时,只要我在 forEach 循环中,rests 数组就会被填充。 但是一旦 forEach 循环完成,其余列表是空的吗?怎么会这样? 我想要做的是继续将数据添加到 CustomerRestaurantsWithLunchCard = c 到类中存在的餐厅列表中

  Future<CustomerRestaurantsWithLunchCard>
      customerRestaurantsWithLunchards() async {
    var c = await _service.document(
        path: APIPath.customerRestaurantsWithLunchCardsDocument(customerId),
        builder: (data, id) =>
            CustomerRestaurantsWithLunchCard.fromMap(data, id));

    var rests = new List<Restaurant>();

    c.myRestaurantsReferences.forEach((reference) {
      _service.document(
          path: (reference),
          builder: (data, id) => {
                rests.add(new Restaurant(
                  id: id,
                )),
              });
    });

    c.restaurants = rests;
    return c;
  }

Future<T> document<T>({
    @required String path,
    @required T builder(Map<String, dynamic> data, String id),
  }) {
    final reference = FirebaseFirestore.instance.doc(path);
    final snapshots = reference.get();
    return snapshots.then((value) => builder(value.data(), value.id));
  }

【问题讨论】:

    标签: firebase flutter dart


    【解决方案1】:

    在 foreach 中为第二个 _service.document 添加等待:

    Future<CustomerRestaurantsWithLunchCard>
          customerRestaurantsWithLunchards() async {
        var c = await _service.document(
            path: APIPath.customerRestaurantsWithLunchCardsDocument(customerId),
            builder: (data, id) =>
                CustomerRestaurantsWithLunchCard.fromMap(data, id));
    
        List<Restaurant> rests = await new List<Restaurant>(); 
        await c.myRestaurantsReferences.forEach((reference) {
          await _service.document(
              path: (reference),
              builder: (data, id) => {
                    rests.add(new Restaurant(
                      id: id,
                    )),
                  });
        });
    
        c.restaurants = await rests;
        return c;
      }
    

    【讨论】:

    • 那不行,结果一样。
    • 对所有内容添加等待以使函数同步但返回未来怎么样?
    • 据我所知,在异步函数中,每行指令都是异步执行的,所以...
    • so awaiting for 每行都会导致同步行为
    【解决方案2】:

    在另一个帖子Async/Await List.forEach找到答案

    新代码是:

      Future<CustomerRestaurantsWithLunchCard>
          customerRestaurantsWithLunchards() async {
        var c = await _service.document(
            path: APIPath.customerRestaurantsWithLunchCardsDocument(customerId),
            builder: (data, id) =>
                CustomerRestaurantsWithLunchCard.fromMap(data, id));
    
        int noOfReferences = c.myRestaurantsReferences.length;
    
        for (var i = 0; i < noOfReferences; i++) {
          await _service.document(
              path: c.myRestaurantsReferences[i],
              builder: (data, id) => {c.restaurants.add(new Restaurant(id: id))});
        }
    return c;
    

    }

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 2014-01-13
      • 2021-10-07
      • 2023-01-16
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多