You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:10:44