在Flutter中从API解析JSON,每次只返回50个结果



我一直在Flutter应用程序中使用Nutritionix API。Nutritionix使用他们的API一次只返回50个结果,通过与他们交谈(我们的团队与他们制定了一个计划(,处理它的唯一方法就是围绕它进行编码。我仍然在学习如何在掌握Dart/Flutter的同时最好地处理API调用和解析JSON文件。我目前的策略是试着提前打电话给API,以获取某家餐厅的房源总数。

来自我的nutritixCall.dart文件:

static Resource<int> getTotalNum (String restaurant){
return Resource(
url: 'https://api.nutritionix.com/v1_1/search/' + restaurant + '?results=0:50&fields=item_name,brand_name,nf_calories,nf_sodium,nf_sugars,nf_cholesterol,nf_total_fat,nf_dietary_fiber&appId=816cee15&appKey=API_KEY',
parse: (response) {
final result = json.decode(response.body);
return result['total_hits'];
}
);

}

然后我的想法是,我可以将总数加载到对API的后续调用中,并继续以50为增量调用API来填充列表。这并不奇怪地失败得很惨,只是在我尝试调用它时导致模拟器失速

来自我的nutritixList.dart文件:

for (int i =0; i <= totalListings; i+51) {
Webservice().load(NutritionixData.get(restaurant, category, i)).then((
nutritionListings) =>
{

setState(() =>
{
_nutritionixData += _nutritionixData + nutritionListings
})
});
}

}

来自我的nutritionixCall.dart文件:

static Resource<List<NutritionixData>> get (String restaurant, String category, int minResults) {

final nutritionalIncrement = 50;
int maxResults = minResults + nutritionalIncrement;


return Resource(
url: 'https://api.nutritionix.com/v1_1/search/' + restaurant + '?results='+ minResults.toString() + ':' + maxResults.toString() + '&fields=item_name,brand_name,nf_calories,nf_sodium,nf_sugars,nf_cholesterol,nf_total_fat,nf_dietary_fiber&appId=',
parse: (response) {
final result = json.decode(response.body);
Iterable list = result['hits'];


list = list.map((model) => NutritionixData.fromJson(model)).toList();
return list.where((f) => f.nutritionFields.nfCategory.contains(category)).toList();
}
);

}

如果有人有任何通过API排序的经验,该API只返回Flutter的每个查询的一小部分结果,我将永远感激。

您需要立即处理API的所有结果,还是在用户滚动显示时将其显示给用户?如果是后者,则不应立即加载所有数据,而是在用户滚动时惰性地加载数据。

对于后者,我发现了这个例子:https://www.initpals.com/flutter/how-to-lazy-load-large-list-from-http-rest-api-with-pagination-in-flutter/.(警告:我没有试过,所以不能保证质量。(

最新更新