Flutter:如何使用foreach从Firebase获取数据以从文档中恢复ID

时间:2019-04-11 19:08:35

标签: android firebase flutter

我有此代码,List<Widget>> productRelated返回null或[],我需要此数据用于函数getRelatedProductsWidget

Future<List<Widget>> getRelatedProductWidgets(List<dynamic> eans) async {
    final List<Widget> productsRelated = [];

    eans.forEach((e) async {
      DocumentSnapshot result = await Firestore.instance.collection('products').document(e).get();
      Product product = Product.fromMap(result);
      productsRelated.add(new ListTile(title: Text(product.productName)));
    }); 
    return productsRelated;
}


Widget getRelatedProductsWidget(List<dynamic> relatedProducts) {
    return FutureBuilder(
      future: getRelatedProductWidgets(relatedProducts),
      builder: (context, snapshot) {
        List<Widget> products = snapshot.data ?? [];
        print(products);
        return ListView.builder(
          shrinkWrap: true,
          itemCount: products.length,
          itemBuilder: (context, index) {
            return products[index];
          },
        );
      },
    );
  }

我会非常感激的

2 个答案:

答案 0 :(得分:1)

第一个方法返回一个空列表,因为您不告诉代码在返回变量之前先等待异步调用完成。因此,从本质上讲,该变量被初始化(或声明),启动一些异步调用,然后返回该变量。

您可以使用“ x = await Future.wait(y.map(将元素映射到数据库调用的方法));返回x;”或使用类似“返回y.forEach(...).then(...返回x);”之类的东西。返回该链的结果。

答案 1 :(得分:1)

解决方案:

await Future.wait(eans.map((e) async {
    DocumentSnapshot result =
        await Firestore.instance.collection('products').document(e).get();
    product.add(Product.fromMap(result))  
}));