Flutter中如何使用Future.wait并行请求多个Future<List>并解决类型报错
错误原因
- 泛型不匹配:你的3个请求方法返回值都是
Future<List<Result>>,Future.wait执行后会返回Future<List<List<Result>>>(外层List对应3个请求的返回结果,每个元素是单个请求返回的Result数组),但你给FutureBuilder声明的泛型是List<Result>,和实际返回类型不匹配触发报错。 - 参数缺失:调用
fetchResult2、fetchResult3时没有传入必填的mv_id参数,就算类型问题解决也会触发参数异常。 - 加载判断逻辑错误:原判断逻辑只覆盖了
ConnectionState.none的场景,没有处理加载中、请求失败的情况,数据为空时会触发空指针异常。
修复方案
如果你需要把3个接口返回的Result数组合并成一个列表展示,直接用以下修正后的UI代码即可:
class Results extends StatelessWidget { final int mrId; const Results({Key? key, required this.mrId}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), // 修正泛型为List<List<Result>>,匹配Future.wait的返回类型 body: FutureBuilder<List<List<Result>>>( // 给三个请求都传入正确的mv_id参数 future: Future.wait([fetchResult1(mrId), fetchResult2(mrId), fetchResult3(mrId)]), builder: (context, snapshot) { // 处理加载中状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 处理请求失败状态 if (snapshot.hasError) { return Center(child: Text('请求失败:${snapshot.error}')); } // 拿到三个接口的返回数组,合并为一个大的Result数组 List<Result> allResults = []; for (var list in snapshot.data!) { allResults.addAll(list); } return ListView.builder( itemCount: allResults.length, itemBuilder: (context, index) { Result project = allResults[index]; return ListTile( title: Text(project.rlLaststation), subtitle: Text(project.rlLaststation), ); }); })); } }
如果你需要分别使用三个接口的返回数据,不需要合并,直接通过下标取值即可:
- 第一个接口返回数据:
snapshot.data![0] - 第二个接口返回数据:
snapshot.data![1] - 第三个接口返回数据:
snapshot.data![2]
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

