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

Flutter中API返回非空List却被判定为null的问题排查

问题解决:Flutter解析天气API时map()调用在null上的错误

核心原因

你调用了错误的OpenWeatherMap API接口:当前用的是/data/2.5/weather(实时天气接口),这个接口返回的JSON结构里没有list字段,所以解析时json["list"]为null,调用.map()就会触发错误。而你的FivedayForecastData类是为5天预报接口设计的,对应的正确接口是/data/2.5/forecast。

具体修复步骤

1. 修正API请求链接

把接口路径从weather改为forecast,这是OpenWeatherMap提供5天逐3小时预报的官方接口:

Future<FivedayForecastData?> fetchFiveDayForecast({
  required double latitude,
  required double longitude,
  required String apiKey,
}) async {
  // 替换为forecast接口
  final link =
      'https://api.openweathermap.org/data/2.5/forecast?lat=$latitude&lon=$longitude&appid=$apiKey&units=metric';

  final result = await http.get(Uri.parse(link));
  if (result.statusCode == 200) {
    // 直接用jsonDecode解析,无需toString()
    final data = FivedayForecastData.fromJson(jsonDecode(result.body));
    return data;
  }
  return null;
}

2. 增强JSON解析的空安全性

即使使用正确接口,也建议做防御性编程,避免字段为null的情况。修改fromJson工厂方法,为可能为空的字段添加默认值:

factory FivedayForecastData.fromJson(Map<String, dynamic> json) => FivedayForecastData(
    cod: json["cod"] ?? "",
    message: json["message"] ?? 0,
    cnt: json["cnt"] ?? 0,
    // 先判断list是否为null,为空则返回空列表
    list: (json["list"] as List?)?.map((x) => ListElement.fromJson(x)).toList() ?? [],
    // 处理city字段可能为空的情况,根据你的City类结构调整默认值
    city: json["city"] != null ? City.fromJson(json["city"]) : City(name: "", id: 0),
);

3. 调试建议

遇到JSON解析问题时,先打印API返回的原始数据,确认字段是否存在:

if (result.statusCode == 200) {
  print(result.body); // 查看实际返回的JSON结构
  final data = FivedayForecastData.fromJson(jsonDecode(result.body));
  return data;
}

这样能快速验证接口返回的字段是否和你的数据类匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:48:28