Flutter调用NewsApi出现NoSuchMethodError cast方法匹配错误如何解决
问题根因
NewsApi返回的响应为外层包裹的Map结构,不是直接的新闻列表:
{ "status": "ok", "totalResults": xxx, "articles": [/* 新闻列表存储在该字段下 */] }
你代码中parseArticles方法直接对jsonDecode返回的Map对象调用cast<Map<String, dynamic>>(),Map类型的cast方法作用是转换自身键值对的泛型,无法将Map转为列表,因此触发类型匹配报错。
修复代码
替换你的parseArticles方法即可:
List<Article> parseArticles(String responseBody) { // 先将解析结果转为Map类型 final parsed = jsonDecode(responseBody) as Map<String, dynamic>; // 取出articles字段对应的列表做类型转换 final articlesList = parsed['articles'] as List; return articlesList.map<Article>((json) => Article.fromJson(json as Map<String, dynamic>)).toList(); }
可选优化
NewsApi部分返回字段可能为空,直接赋值给非空类型会触发运行时错误,建议修改Article.fromJson方法增加空值处理:
factory Article.fromJson(Map<String, dynamic> json) { return Article( author: json['author'] ?? '未知作者', title: json['title'] ?? '无标题', description: json['description'] ?? '无描述', url: json['url'] ?? '', urlToImage: json['urlToImage'] ?? '', content: json['content'] ?? '无内容', ); }
渲染图片时增加错误占位,避免空链接或无效链接导致页面报错:
Image.network( articles[index].urlToImage, height: 150, width: double.infinity, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) => Container( height: 150, color: Colors.grey[200], child: const Icon(Icons.broken_image, size: 48, color: Colors.grey), ), )
内容的提问来源于stack exchange,提问作者Shegmatech
相关产品推荐
相关产品推荐

