我想在for循环中添加很多请求。这是我的网络方法。
Future postdata<T, F extends ApiResponseFromJson>({
@required T? requestmodel,
@required F? responsemodel,
@required String? path,
}) async {
try {
final response = await dio.post(path!, data: requestmodel);
print(ApiPath.API_URL + path);
if (response.data is List) {
return List<F>.from(
(response.data).map((e) => responsemodel!.fromJson(e)));
}
return responsemodel!.fromJson(response.data);
} on DioError catch (e) {
final errorMessage = DioExceptions.fromDioError(e).toString();
showSnackBarDialog("Hata", errorMessage, const Icon(Icons.error))
};
List<CarModel> carModel=[CarModel(),CarModel(),CarModel()...]
Future<ResponseModel?> postData(int index) async {
responseModel.carModel = carModel[i];
responseModel= await _networkService
.postdata<RequestModel, ResponseModel>(
requestmodel: requestModel,
responsemodel: ResponseModel(),
path: ApiPath.API_DATA_LINK);
return responseModel;
}
_allListModel() async {
for (var i = 0; i < carModel.length; i++) {
differentList.add(await postData(i));
}
我有不同的列表,我需要请求列表的长度。但是在for循环中,总是等待另一个索引。但我不需要等待。因为networkModel
去了长度不同的API列表,我不知道哪个结果会先到达。
我想请求在for循环,我不需要其他索引。我该怎么办?
此代码一次调用所有请求,仅删除await
,并在请求结束时调用then
方法:
_allListModel() {
for (var i = 0; i < carModel.length; i++) {
postData(i).then((value) {
differentList.add(value);
});
}
}
您应该使用Future.wait
等待多个期货。你开始所有的,然后你等待,直到所有的完成,并将所有的结果添加到列表。
Future<void> _allListModel() async {
var futures = <Future<>>[]
for (var i = 0; i < carModel.length; i++) {
futures.add(postData(i));
}
var responses = await Future.wait(futures);
differentList.addAll(responses);
}