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
相关产品推荐
相关产品推荐

