Flutter中WeatherModel解析JSON时Temp与minTemp返回null问题排查
问题排查:Flutter WeatherModel中temp/minTemp为null,但date正常获取
问题现象
执行Flutter代码时,WeatherModel的temp和minTemp字段返回null,但date字段能正常获取到值。
代码实现
class WeatherModel { final String? date; final double? temp; final double? maxTemp; final double? minTemp; final String? weatherStateName; WeatherModel( {required this.date, required this.temp, required this.maxTemp, required this.minTemp, required this.weatherStateName}); factory WeatherModel.fromJson(dynamic data) { var jsonData = data['forecast']?['forecastday']?[0]?['day']; print('$jsonData'); return WeatherModel( date: data['location']?['localtime'], temp: jsonData?['avgtemp_c'], maxTemp: jsonData?['maxtemp_c'], minTemp: jsonData?['mintemp_c'], weatherStateName: jsonData?['condition']?['text']); } @override String toString() { return 'tem = $temp minTemp = $minTemp date = $date'; } }
执行日志
I/flutter ( 5213): tem = null minTemp = null date = 2022-08-25 20:26
排查原因
核心问题出在API返回数据的解析路径或字段名不匹配:
- 代码中通过
data['forecast']?['forecastday']?[0]?['day']获取天气详情,但如果接口返回的forecast下的数组键名不是forecastday(比如拼写错误、命名格式不同),会导致jsonData为null,后续的avgtemp_c等字段自然也为null。 - 若
jsonData打印有内容但字段为null,可能是avgtemp_c/mintemp_c等字段名和接口实际返回的不一致(比如接口用下划线命名avg_temp_c)。 - 另外,接口返回的温度可能是整数类型,直接赋值给
double?类型可能存在隐式转换失败的情况。
解决方案
1. 确认API数据结构
先打印完整的API返回数据,明确字段层级和命名:
factory WeatherModel.fromJson(dynamic data) { // 打印完整数据,确认路径正确性 print('Full API Response: $data'); var jsonData = data['forecast']?['forecastday']?[0]?['day']; print('Day Data: $jsonData'); // ... 后续代码 }
根据打印结果修正forecast到day的解析路径,确保键名完全匹配。
2. 修正字段解析与类型转换
针对字段名匹配和类型转换问题,调整代码:
factory WeatherModel.fromJson(dynamic data) { var jsonData = data['forecast']?['forecastday']?[0]?['day']; return WeatherModel( date: data['location']?['localtime'], // 显式处理类型转换,兼容整数/浮点返回值 temp: jsonData?['avgtemp_c'] is num ? (jsonData?['avgtemp_c'] as num).toDouble() : null, maxTemp: jsonData?['maxtemp_c'] is num ? (jsonData?['maxtemp_c'] as num).toDouble() : null, minTemp: jsonData?['mintemp_c'] is num ? (jsonData?['mintemp_c'] as num).toDouble() : null, weatherStateName: jsonData?['condition']?['text'], ); }
3. 兜底处理(可选)
如果API存在字段缺失情况,可以给参数添加默认值,避免构造函数报错:
WeatherModel({ required this.date, required this.temp, required this.maxTemp, required this.minTemp, required this.weatherStateName, }) : temp = temp ?? 0.0, maxTemp = maxTemp ?? 0.0, minTemp = minTemp ?? 0.0;
内容的提问来源于stack exchange,提问作者basbos
相关产品推荐
相关产品推荐

