Flutter中使用Future.wait处理Future<List<T>>的赋值报错问题
问题解决建议
你的写法报错是因为Future.wait要求传入的是Future对象的列表,但castMembers=await getCast()这个语句会先执行await getCast(),把结果赋值给castMembers,最终返回的是List<Cast>类型,并非Future,不符合参数要求。而且这么写本质上已经把getCast()变成了同步执行,完全失去了并行请求的优化意义。
下面是两种正确的并行实现方式,既能让getCast()和其他API请求同时执行,又能把结果赋值给castMembers:
方式一:通过Future.wait的结果列表赋值
把getCast()直接加入Future列表,等所有请求完成后,从返回的结果列表里取出对应的值赋值:
Future<void> callApi() async{ // 所有请求并行执行 final results = await Future.wait([ getAdresses(), getCountries(), getPrices(), getCast() ]); // 根据列表顺序取出getCast的结果(索引对应加入顺序) castMembers = results[3] as List<Cast>; }
注意:Future.wait返回的results列表顺序和你传入的Future顺序完全一致,要确保索引对应正确;另外因为results的类型是List<Object?>,需要做一次类型转换。
方式二:用匿名Future包装赋值逻辑
把赋值逻辑包装成一个匿名的Future,这样可以直接放进Future.wait的列表里,并行执行的同时完成赋值:
Future<void> callApi() async{ await Future.wait([ getAdresses(), getCountries(), getPrices(), // 包装成Future<void>,内部完成赋值 (() async { castMembers = await getCast(); })() ]); }
这种方式不需要关心结果的索引位置,逻辑更直观,尤其适合Future数量较多的场景。
两种方式都能实现所有API请求并行执行,不会出现等待getCast()完成后再执行其他请求的情况,达到优化请求流程的目的。
内容的提问来源于stack exchange,提问作者Ballazx
相关产品推荐
相关产品推荐

