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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:27:01