Flutter中如何从Rest API筛选出type为Lunch的指定数据
如何筛选API返回中type为Lunch的数据条目
问题分析
你需要从API返回的数组中筛选出type为lunch的条目,现有代码的核心问题是筛选逻辑未正确修改数据模型,导致筛选操作完全无效。
修正方案
首先确保你的模型结构定义正确,然后调整数据获取与筛选逻辑:
1. 模型结构参考
class ProductsModel { bool success; List<FoodItem> data; String message; ProductsModel({required this.success, required this.data, required this.message}); factory ProductsModel.fromJson(Map<String, dynamic> json) { return ProductsModel( success: json['success'], data: List<FoodItem>.from(json['data'].map((x) => FoodItem.fromJson(x))), message: json['message'], ); } } class FoodItem { int id; String name; String type; // 补充carbs、proteins等其他字段的定义与解析逻辑 FoodItem({required this.id, required this.name, required this.type/*, 其他参数*/}); factory FoodItem.fromJson(Map<String, dynamic> json) { return FoodItem( id: json['id'], name: json['name'], type: json['type'], // 解析其他字段 ); } }
2. 修正后的获取与筛选函数
Future<ProductsModel> getLunchProducts() async { try { const url = 'https://diet.appetitor.app/Celo/api/user/food/2000.0'; final response = await Dio().get( url, options: Options(headers: { HttpHeaders.contentTypeHeader: "application/json", }), ); if (response.statusCode == 200) { // 解析完整的API响应模型 final originalModel = ProductsModel.fromJson(response.data); // 筛选type为lunch的条目(忽略大小写,兼容Lunch/lunch等写法) final filteredFoods = originalModel.data.where((item) { return item.type.toLowerCase() == 'lunch'; }).toList(); // 返回包含筛选后数据的新模型 return ProductsModel( success: originalModel.success, data: filteredFoods, message: originalModel.message, ); } else { throw Exception('Failed to load food data'); } } on DioError catch (e) { print(e.response?.data ?? e.message); rethrow; } }
关键修改点
- 仅解析一次API响应,避免重复创建模型实例
- 使用
where方法过滤data列表,通过toLowerCase()统一大小写,确保匹配所有大小写形式的lunch条目 - 将过滤后的Iterable转换为List,并创建新的
ProductsModel实例返回(保持数据不可变性)
如果需要保留原函数的query参数逻辑(支持动态筛选),可以调整为:
Future<List<ProductsModel>> getProducts({String? query}) async { final products = <ProductsModel>[]; try { const url = 'https://diet.appetitor.app/Celo/api/user/food/2000.0'; final response = await Dio().get( url, options: Options(headers: { HttpHeaders.contentTypeHeader: "application/json", }), ); if (response.statusCode == 200) { final originalModel = ProductsModel.fromJson(response.data); List<FoodItem> filteredData = originalModel.data; // 当query存在时,按关键词筛选 if (query != null) { filteredData = originalModel.data.where((item) { return item.type.toLowerCase().contains(query.toLowerCase()); }).toList(); } products.add(ProductsModel( success: originalModel.success, data: filteredData, message: originalModel.message, )); } } on DioError catch (e) { print(e.response?.data ?? e.message); } return products; }
内容的提问来源于stack exchange,提问作者Muhammad Usman
相关产品推荐
相关产品推荐

