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

Flutter Switch条件未执行求助:API数据按类型分列表

问题描述

我是编程新手,正尝试获取API数据并根据文章类型将其分类到不同列表中。目前遇到问题:在HomeFeedProvider的fetchHomeFeedData方法中,Switch条件语句未执行——控制台在Switch前有打印输出,但Switch内部的case和default分支均无执行。已创建对应Model,请求协助排查解决。

API返回数据示例

[
  {
    "type": "article",
    "data": {
      "post_id": 11530,
      "thumbnail_image": "https://www.beingtheparent.com/wp-content/uploads/2015/10/Home-Remedies-For-Swollen-Feet-During-Pregnancy.jpg",
      "count": 15,
      "Title": "Home Remedies For Swollen Feet During Pregnancy",
      "content": "The word edema denotes swelling and during pregnancy, most women at any stage can suffer from swelling in ankles, hands,..",
      "permalink": "https://www.beingtheparent.com/top-10-home-remedies-for-swollen-feet-during-pregnancy/",
      "slug": "top-10-home-remedies-for-swollen-feet-during-pregnancy",
      "categoryName": "2b. Health & Safety",
      "categorySlug": "health-and-safety",
      "week_category_name": "Pregnancy Week 30",
      "week_category_slug": "pregnancy-week-30",
      "special_category_name": "",
      "special_category_slug": "",
      "child_safety_category_name": "",
      "child_safety_category_slug": "",
      "life_skills_category_name": "",
      "life_skills_category_slug": "",
      "post_tag_name": "Week 29",
      "post_tag_slug": "week-29"
    }
  },
  {
    "type": "article",
    "data": {
      "post_id": 11531,
      "thumbnail_image": "https://www.beingtheparent.com/wp-content/uploads/2015/10/Home"
    }
  }
]

当前代码

enum HomeFeedProviderState { idle, loading, loaded, error }

class HomeFeedProvider extends ChangeNotifier {
  List<FeedDataModel2> feedDatacollection = [];

  List<Data22> userpostCollection = [];
  List<Data22> articlesPostcollection = [];
  List<Data22> momsLikeyoucollection = [];

  HomeFeedProviderState currenstState = HomeFeedProviderState.idle;

  static HomeFeedProvider instance = HomeFeedProvider();
  Future<void> fetchHomeFeedData() async {
    currenstState = HomeFeedProviderState.loading;
    notifyListeners();
    var url = 'https://auth.dev.beingtheparent.com/Btpmobileapi/get_feed';

    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      var feed = jsonDecode(response.body);

      var data = feed['data'];

      print("feedData$data");

      print("newones ${data['type'].runtimeType}");

      switch (data["type"]) {
        case "article":
          {
            print('kind');
            articlesPostcollection.clear();
            articlesPostcollection.add(data['article']);
            print("hold${articlesPostcollection.length}");
            print('nobody');
            break;
          }
        default:
          {
            print('Unhandleddata type: ${data["type"]}');
            break;
          }
      }

      print("articles$articlesPostcollection");

      FeedDataModel2 feedDataModel2 = FeedDataModel2.fromJson(feed);

      feedDatacollection.clear();

      feedDatacollection.add(feedDataModel2);

      currenstState = HomeFeedProviderState.loaded;

      notifyListeners();
    } else {
      currenstState = HomeFeedProviderState.error;

      print("iconlistdatas${response.statusCode}");
      notifyListeners();
    }
  }
}  
问题排查与解决

核心问题分析

  1. API数据结构理解错误:API返回的feed['data']是数组(List),包含多个条目。直接通过data["type"]取值会报错(List无法通过字符串索引访问),导致Switch代码根本没执行。
  2. 数据字段路径错误:每个条目的内容存在item["data"]字段下,而非代码中写的data['article']。
  3. 拼写错误:currenstState应为currentState,虽不影响功能,但降低代码可读性。

修复后的代码

enum HomeFeedProviderState { idle, loading, loaded, error }

class HomeFeedProvider extends ChangeNotifier {
  List<FeedDataModel2> feedDatacollection = [];

  List<Data22> userpostCollection = [];
  List<Data22> articlesPostcollection = [];
  List<Data22> momsLikeyoucollection = [];

  HomeFeedProviderState currentState = HomeFeedProviderState.idle; // 修正拼写错误

  static HomeFeedProvider instance = HomeFeedProvider();
  Future<void> fetchHomeFeedData() async {
    currentState = HomeFeedProviderState.loading;
    notifyListeners();
    var url = 'https://auth.dev.beingtheparent.com/Btpmobileapi/get_feed';

    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      var feed = jsonDecode(response.body);
      var dataList = feed['data'] as List; // 明确声明为List类型

      print("feedData $dataList");

      // 遍历每个条目处理
      for (var item in dataList) {
        final itemType = item["type"] as String;
        print("当前条目类型: $itemType");

        switch (itemType) {
          case "article":
            print('处理article类型数据');
            // 解析data字段为Data22模型
            Data22 articleData = Data22.fromJson(item["data"]);
            articlesPostcollection.add(articleData);
            print("articles列表长度: ${articlesPostcollection.length}");
            break;
          case "user_post": // 可根据实际API返回类型扩展
            Data22 userPostData = Data22.fromJson(item["data"]);
            userpostCollection.add(userPostData);
            break;
          case "moms_like_you":
            Data22 momsData = Data22.fromJson(item["data"]);
            momsLikeyoucollection.add(momsData);
            break;
          default:
            print('未处理的数据类型: $itemType');
            break;
        }
      }

      print("最终articles列表: $articlesPostcollection");

      FeedDataModel2 feedDataModel2 = FeedDataModel2.fromJson(feed);
      feedDatacollection.clear();
      feedDatacollection.add(feedDataModel2);

      currentState = HomeFeedProviderState.loaded;
      notifyListeners();
    } else {
      currentState = HomeFeedProviderState.error;
      print("请求失败,状态码: ${response.statusCode}");
      notifyListeners();
    }
  }
}

关键修复点说明

  • 将data改为dataList并明确为List类型,遍历每个条目处理。
  • 从item["type"]获取条目类型,从item["data"]解析内容为Data22模型。
  • 修正currenstState的拼写错误。
  • 添加其他类型的case示例,可根据实际API返回扩展。
  • 增加清晰的打印日志,方便调试。

内容的提问来源于stack exchange,提问作者Diljith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:45:25