我正在Flutter中从API获取数据。数据来自多个API,所以我使用Future.wait来使它更流畅。我有这个变量:
late List<Cast> castMembers;
和此函数:
Future<List<Cast>> getCast() async {
List<Cast> members= [];
// here is the logic of serialization etc...
return members;
}
最后是Future的函数。等等:
Future<void> callApi() async{
await Future.wait([
getAdresses(),
getCountries(),
getPrices(),
castMembers=await getCast()
]);
}
如果我把castMembers=await getCast()
放在Future.wait
之前,它工作正常,但在这种情况下,Future.wait
内部的方法不会执行,因为我们正在等待getCast()
。
对此您有何建议?
2条答案
按热度按时间nuypyhwy1#
在
Future<List<Cast>>
上使用await
将生成List<Cast>
。因此,执行await Future.wait([await getCast()]);
将尝试使用非Future
调用Future.wait
,这是不允许的。正如@pskink提到的,
Future.wait
返回返回值的List
,您可以使用它:推测为
getAdresses
(原文如此)、getCountries
、getPrices
和getCast
都返回不同的类型,因此results
将是最接近的公共基类型(可能是Object
或List<Object>
),并且需要显式的向下转换。而且它还有点脆弱,因为如果您向Future.wait
调用添加新的Future
,您可能需要调整从results
访问哪个元素,而这在编译时不会强制执行。或者,您可以使用我在Dart Future.wait for multiple futures and get back results of different types中描述的方法:
这是我使用
Future.then
的少数几种情况之一,或者将赋值语句封装在一个单独的函数中,使用纯async
-await
:sg3maiej2#
不应将字段
castMembers
作为数组中的成员,因为它不是Future
。当您键入
castMembers=await getCast()
时,它将计算getCast()
,将其值放入castMembers
,并将此值添加到列表中。换句话说,您应该:
代替
如果你想初始化变量,那么单独做: