All*_*son 5 api json dart flutter
我有一个返回一些数据的api。我只需要从 api 中获取菜肴数据。问题是当我从 api 响应中获取数据时,第一道菜数据仅保存到iteratable list.
编辑
我无法从可迭代列表中获取数据
api 如下所示
[
{
"restaurant_name": "Cafe",
"restaurant_image": "http://restaurants.unicomerp.net/images/Restaurant/1010000001.jpg",
"table_id": "1",
"table_name": "Table 01",
"branch_name": "Cafe",
"nexturl": "http://snapittapp.snapitt.net/api/menu/10/?org=1010000001&branch_id=1000000001&limit=10&offset=20&lang=en",
"table_menu_list": [
{
"menu_category": "Salads and Soup",
"menu_category_id": "11",
"menu_category_image": "http://restaurants.unicomerp.net/images/Restaurant/Item/ItemGroup_11.jpg",
"nexturl": "http://snapittapp.snapitt.net/api/menu/20/?org=1010000001&branch_id=1000000001&menuCat=11&limit=10&offset=20&lang=en",
"category_dishes": [
{
"dish_id": "100000001",
"dish_name": "Spinach Salad",
"dish_price": 7.95,
"dish_image": "http://restaurants.unicomerp.net//images/Restaurant/1010000001/Item/Items/100000001.jpg",
"dish_currency": "SAR",
"dish_calories": 15,
"dish_description": "Fresh spinach, mushrooms, and hard-boiled egg served with warm bacon vinaigrette",
"dish_Availability": true,
"dish_Type": 2,
"nexturl": "http://snapittapp.snapitt.net/api/menu/30/?org=1010000001&branch_id=1000000001&menuItem=100000001&limit=10&offset=20&lang=en",
"addonCat": [
{
"addon_category": "Spicy/Non-Spicy",
"addon_category_id": "104",
"addon_selection": 0,
"nexturl": "http://snapittapp.snapitt.net/api/menu/40/?org=1010000001&branch_id=1000000001&menuItem=100000001&menuAddonCat=104&menuAddonselc=0&limit=10&offset=20&lang=en",
"addons": [
{
"dish_id": "100000032",
"dish_name": "Non Spicy",
"dish_price": 25,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/Item/Item_100000025.jpg",
"dish_currency": "SAR",
"dish_calories": 15,
"dish_description": "Non Spicy",
"dish_Availability": true,
"dish_Type": 1
}
]
},
{
"addon_category": "Add On",
"addon_category_id": "101",
"addon_selection": 1,
"nexturl": "http://snapittapp.snapitt.net/api/menu/40/?org=1010000001&branch_id=1000000001&menuItem=100000001&menuAddonCat=101&menuAddonselc=1&limit=10&offset=20&lang=en",
"addons": [
{
"dish_id": "100000020",
"dish_name": "fried onions",
"dish_price": 15,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/Item/Item_100000020.jpg",
"dish_currency": "SAR",
"dish_calories": 10,
"dish_description": "fried onions",
"dish_Availability": true,
"dish_Type": 2
}
]
}
]
},
{
"dish_id": "100000003",
"dish_name": "Traditional New England Seafood Chowder",
"dish_price": 12,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/1010000001/Item/Items/100000003.jpg",
"dish_currency": "SAR",
"dish_calories": 30,
"dish_description": "with clams, scallops, and shrimp,",
"dish_Availability": true,
"dish_Type": 1,
"nexturl": "http://snapittapp.snapitt.net/api/menu/30/?org=1010000001&branch_id=1000000001&menuItem=100000003&limit=10&offset=20&lang=en",
"addonCat": []
},
{
"dish_id": "100000004",
"dish_name": "Salad Bar Soup",
"dish_price": 5,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/1010000001/Item/Items/100000004.jpg",
"dish_currency": "SAR",
"dish_calories": 30,
"dish_description": "Flour Mixed with fresh green leafy vegetables",
"dish_Availability": true,
"dish_Type": 2,
"nexturl": "http://snapittapp.snapitt.net/api/menu/30/?org=1010000001&branch_id=1000000001&menuItem=100000004&limit=10&offset=20&lang=en",
"addonCat": []
},
{
"dish_id": "100000005",
"dish_name": "chicken-soup",
"dish_price": 14.89,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/1010000001/Item/Items/100000005.jpg",
"dish_id": "100000029",
"dish_name": "Tacos",
"dish_price": 25,
"dish_image": "http://restaurants.unicomerp.net/images/Restaurant/Item/Item_100000029.jpg",
"dish_currency": "SAR",
"dish_calories": 225,
"dish_description": "Mexican Street Tacos",
"dish_Availability": true,
"dish_Type": 3,
"nexturl": "http://snapittapp.snapitt.net/api/menu/30/?org=1010000001&branch_id=1000000001&menuItem=100000029&limit=10&offset=20&lang=en",
"addonCat": []
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
api中有一个名为addonCat的数据类别,我需要在从响应中获取数据时将其忽略并继续下一道菜。
api_model.dart这是我从 api 的响应中获取数据的地方
class CategoryDishes {
final String dishId;
final String dishName;
final double dishPrice;
final String dishImage;
final String dishCurrency;
final double dishCalories;
final String dishDescription;
final bool dishAvailability;
final double dishType;
final String nexturl;
//final List<AddonCat> _addonCat;
CategoryDishes(
{this.dishId,
this.dishName,
this.dishPrice,
this.dishImage,
this.dishCurrency,
this.dishCalories,
this.dishDescription,
this.dishAvailability,
this.dishType,
this.nexturl});
factory CategoryDishes.fromJson(Map<String, dynamic> json) {
return CategoryDishes(
dishId: json['dish_id'],
dishName: json['dish_name'],
dishPrice: json['dish_price'].toDouble(),
dishImage:
json['dish_image'] ?? Constants.FOOD_PLACEHOLDER_IMAGE_ASSET_URL,
dishCurrency: json['dish_currency'],
dishCalories: json['dish_calories'].toDouble(),
dishDescription: json['dish_description'],
dishAvailability: json['dish_Availability'],
dishType: json['dish_Type'].toDouble(),
nexturl: json['nexturl']);
}
static Resource<List<CategoryDishes>> get all {
return Resource(
url: Constants.FOOD_API_URL,
parse: (response) {
final result = json.decode(response.body.toString());
// print(response);
Iterable list = result[0]['table_menu_list'][0]['category_dishes'];
debugPrint("=========== Dish_List ==============\n" + list.toString());
debugPrint("====================================");
return list.map((model) => CategoryDishes.fromJson(model)).toList();
});
}
}
Run Code Online (Sandbox Code Playgroud)
网络服务.dart
class Resource<T> {
final String url;
T Function(Response response) parse;
Resource({this.url, this.parse});
}
class Webservice {
Future<T> load<T>(Resource<T> resource) async {
final response = await http.get(resource.url);
if (response.statusCode == 200) {
// debugPrint("------D------>\n" + response.body);
return resource.parse(response);
} else {
throw Exception('Failed to load data!');
}
}
}
Run Code Online (Sandbox Code Playgroud)
main.dart
现在我可以将数据保存到可迭代列表中,但无法从列表中获取数据到卡片元素。上面main.dart是我获取数据的地方。
如何实现这一目标?
编辑
我只能得到dishlistapi中的第一部分,在第一类之后有很多菜可用,我需要获取所有的dishlist并将其显示到相应的标签中,参考上面的api链接知道api如何。
任何的意见都将会有帮助。
问题在于,您只对结果和 table_menu_list 中的第一项执行此操作
static Resource<List<CategoryDishes>> get all {
return Resource(
url: Constants.FOOD_API_URL,
parse: (response) {
final result = json.decode(response.body.toString());
// print(response);
Iterable list = result[0]['table_menu_list'][0]['category_dishes'];
debugPrint("=========== Dish_List ==============\n" + list.toString());
debugPrint("====================================");
return list.map((model) => CategoryDishes.fromJson(model)).toList();
});
}
Run Code Online (Sandbox Code Playgroud)
解析函数我会这样做
final result = json.decode(response.body.toString());
// print(response);
List<CategoryDishes> list = []
List.from(result).forEach((item) =>
List.from(item['table_menu_list']).forEach((menuItem) =>
List.from(menuItem['category_dishes']).forEach((dish) =>
list.add(CategoryDishes.fromJson(dish))
)
)
);
debugPrint("=========== Dish_List ==============\n" + list.toString());
debugPrint("====================================");
return list;
Run Code Online (Sandbox Code Playgroud)
如果您不想在列表中出现重复的菜肴(具有相同 id 的菜肴),您可以使用地图
final result = json.decode(response.body.toString());
// print(response);
Map<String, CategoryDishes> map = {}
List.from(result).forEach((item) =>
List.from(item['table_menu_list']).forEach((menuItem) =>
List.from(menuItem['category_dishes']).forEach((dish) =>
map[dish['dish_id']] = CategoryDishes.fromJson(dish);
)
)
);
return map.values.toList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |