在Dart中,可以使用Future.wait()
和async/await
来并发调用多个HTTP端点,将结果合并并返回给单个FutureBuilder
。下面是一个示例代码:
import 'package:http/http.dart' as http;
import 'dart:convert';
Future> fetchData() async {
// 并发调用的HTTP端点列表
List urls = [
'https://api.example.com/endpoint1',
'https://api.example.com/endpoint2',
'https://api.example.com/endpoint3',
];
// 使用Future.wait()并发调用HTTP端点
List> futures = urls.map((url) => http.get(Uri.parse(url))).toList();
List responses = await Future.wait(futures);
// 处理并返回结果
List results = [];
for (http.Response response in responses) {
if (response.statusCode == 200) {
dynamic data = jsonDecode(response.body);
results.add(data);
} else {
results.add(null); // 如果请求失败,添加null到结果列表中
}
}
return results;
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Concurrent HTTP Calls',
home: Scaffold(
appBar: AppBar(
title: Text('Concurrent HTTP Calls'),
),
body: Center(
child: FutureBuilder>(
future: fetchData(),
builder: (BuildContext context, AsyncSnapshot> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
if (snapshot.hasData) {
List data = snapshot.data;
// 在这里使用合并后的结果data
return Text('Data: $data');
} else {
return Text('No data available');
}
}
},
),
),
),
);
}
}
在上面的示例中,fetchData()
函数使用Future.wait()
来并发调用多个HTTP端点,然后将结果存储在results
列表中。然后,FutureBuilder
组件使用fetchData()
返回的Future
作为future
属性,并根据不同的连接状态显示不同的UI。当数据可用时,可以在builder
函数中使用合并后的结果data
进行处理。
上一篇:并发调用DITA OT的问题