我有此代码,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];
},
);
},
);
}
我会非常感激的
答案 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))
}));