Flutter 从一个一次只返回50个结果的API解析颤振中的JSON

Flutter 从一个一次只返回50个结果的API解析颤振中的JSON,flutter,dart,Flutter,Dart,我一直在努力在颤振应用程序中使用NutritionIXAPI。Nutritionix使用API一次只返回50个结果,并且通过与他们交谈(我们的团队与他们制定了一个计划),处理它的唯一方法是围绕它进行编码。我仍然在不断地学习如何最好地处理API调用和解析JSON文件,同时尝试掌握Dart/FLUTER。我目前的策略是尝试预先调用API,以获取特定餐厅的总挂牌数量 从我的nutritionxcall.dart文件: static Resource<int> getTotalNum (St

我一直在努力在颤振应用程序中使用NutritionIXAPI。Nutritionix使用API一次只返回50个结果,并且通过与他们交谈(我们的团队与他们制定了一个计划),处理它的唯一方法是围绕它进行编码。我仍然在不断地学习如何最好地处理API调用和解析JSON文件,同时尝试掌握Dart/FLUTER。我目前的策略是尝试预先调用API,以获取特定餐厅的总挂牌数量

从我的nutritionxcall.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'];
    }
);
for (int i =0; i <= totalListings; i+51) {
   Webservice().load(NutritionixData.get(restaurant, category, i)).then((
       nutritionListings) =>
   {


     setState(() =>
     {
       _nutritionixData += _nutritionixData + nutritionListings
     })
   });
 }
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();
    }
);
静态资源getTotalNum(字符串餐厅){
返回资源(
网址:'https://api.nutritionix.com/v1_1/search/“+restaurant+”?结果=0:50,字段=item\u name,brand\u name,nf\u卡路里,nf\u钠,nf\u糖,nf\u胆固醇,nf\u总脂肪,nf\u膳食纤维&appId=816cee15&appKey=API\u KEY”,
解析:(响应){
最终结果=json.decode(response.body);
返回结果['total_hits'];
}
);
}

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

从my NutritionXList.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'];
    }
);
for (int i =0; i <= totalListings; i+51) {
   Webservice().load(NutritionixData.get(restaurant, category, i)).then((
       nutritionListings) =>
   {


     setState(() =>
     {
       _nutritionixData += _nutritionixData + nutritionListings
     })
   });
 }
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();
    }
);
for(int i=0;i
{
设置状态(()=>
{
_营养学扩展数据+=\u营养学扩展数据+营养学列表
})
});
}
}

从我的nutritionxcall.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'];
    }
);
for (int i =0; i <= totalListings; i+51) {
   Webservice().load(NutritionixData.get(restaurant, category, i)).then((
       nutritionListings) =>
   {


     setState(() =>
     {
       _nutritionixData += _nutritionixData + nutritionListings
     })
   });
 }
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();
    }
);
静态资源获取(字符串餐厅、字符串类别、int minResults){
最终营养增加量=50;
int maxResults=minResults+nutritionalIncrement;
返回资源(
网址:'https://api.nutritionix.com/v1_1/search/“+restaurant+”?结果=“+minResults.toString()+”:“+maxResults.toString()+”&字段=项目名称、品牌名称、nf_卡路里、nf_钠、nf_糖、nf_胆固醇、nf_总脂肪、nf_膳食纤维和appId=”,
解析:(响应){
最终结果=json.decode(response.body);
Iterable list=结果['hits'];
list=list.map((model)=>nutritionxdata.fromJson(model)).toList();
返回列表。其中((f)=>f.nutritionFields.nfCategory.contains(category)).toList();
}
);
}


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

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


对于后者,我发现了以下示例:。(警告:我没有试过,因此无法保证质量。)

这里有一些教程,它可能会对您有所帮助,我已经在我的项目中使用过。这非常有效。我立即处理API结果的唯一原因是我将结果放在某些桶中(“主菜”、“配菜”、“饮料”)。所以我想把所有东西都放在前面,然后根据我的基本算法将项目放在各自的类别中,然后将值返回给类别列表中的用户。项目在显示中的顺序是什么,因为这是您想要检索项目的顺序。如果显示在类别中,则应加载第一个类别的第一个块。如果API支持按类别进行过滤,那么这很简单。如果没有,那么您必须检索项目,对检索到的项目应用您的类别逻辑,直到您获得足够的正确类别-您不需要全部加载它们。