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(); } } }
问题排查与解决
核心问题分析
- API数据结构理解错误:API返回的
feed['data']是数组(List),包含多个条目。直接通过data["type"]取值会报错(List无法通过字符串索引访问),导致Switch代码根本没执行。 - 数据字段路径错误:每个条目的内容存在
item["data"]字段下,而非代码中写的data['article']。 - 拼写错误:
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
相关产品推荐
相关产品推荐

