Flutter-同时请求多个API的最佳方法

时间:2019-11-30 07:41:04

标签: flutter dart future

我有两个URL,我正在使用fetchData()函数来解析json。

Future<Iterable> fetchData() async {
var response = await http.get(firstUrl);
var listOne = List<Article>();

if (response.statusCode == 200) {
  var notesJson = json.decode(response.body);
  var bodyList = notesJson['items'];
  for (var i in bodyList) {
    listOne.add(Article.fromJson(i));
  }
}
var resp = await http.get(secondUrl);
var listTwo = List<Article>();
if (resp.statusCode == 200) {
  var notesJson = json.decode(resp.body);
  var bodyList = notesJson['items'];
  for (var i in bodyList) {
    listTwo.add(Article.fromJson(i));
  }
}

var newL = [...listOne, ...listTwo];
return newL;
}

我觉得这很多余。我想知道这是否是正确的方法,还是可以优化它?由于我要查询两个URL,因此应该改用compute()吗?

2 个答案:

答案 0 :(得分:2)

Flutter的compute产生了其他Isolate(在Dart中类似于线程的东西),并且仅在等待网络请求时这是相当耗费资源的。 很高兴,Dart是基于事件循环的,因此您可以通过将两个网络请求Future封装在对Future.wait的调用中来同时等待两个请求。 有关Dart事件循环的更多信息,您可能需要查看explanatory video about Futures on Flutter's YouTube channel

Future<Iterable> fetchData() async {
  var responses = await Future.wait([
    http.get(firstUrl),
    http.get(secondUrl),
  ]);
  return [
    ..._getArticlesFromResponse(responses.first),
    ..._getArticlesFromResponse(responses[1]),
  ];
}

List<Article> _getArticlesFromResponse(http.Response response) {
  return [
    if (response.statusCode == 200)
      for (var i in json.decode(response.body)['items'])
        Article.fromJson(i),
  ];
}

答案 1 :(得分:0)

如果你有动态列表,你可以使用 Future.forEach 方法;

例如:

var list = ["https://first.api.url",
            "https://second.api.url",
            "https://third.api.url"];

void makeMultipleRequests(){
   await Future.forEach(list, (url) async{
        await fetchData(url);
       });
     }

Future<Iterable> fetchData(String url) async {
       var response = await http.get(url);

     print(response.body);
  
    }