Flutter调用天气API遇NoSuchMethodError问题求助
解决Flutter调用天气预报API时的NoSuchMethodError错误
错误原因
你遇到的NoSuchMethodError核心问题有两个:
- 错误地将API响应解析为
Map<String, dynamic>,但实际上该INMET预报API返回的是数组(List),导致后续试图对Map调用仅List支持的map方法失败。 - API请求已将
countyId拼接到URL路径中,响应体直接是预报数据数组,无需再通过countyId作为键从Map中取值。
另外代码中还存在变量名不一致(定义了lsPrevisaoTempo却赋值给weatherForecastList)、动态返回类型、未处理空值和异常的问题。
修正方案
1. 修正业务逻辑代码
List<Data> lsPrevisaoTempo = []; _getPrediction() async { SharedPreferences pref = await SharedPreferences.getInstance(); var countyID = pref.getInt("county_id"); if (countyID == null) { // 处理地区ID不存在的情况,比如提示用户选择地区 return; } try { final response = await API.getPredictionTime(); setState(() { if (response.statusCode == 200) { // 直接将响应解析为List类型 var jsonResponse = jsonDecode(response.body) as List<dynamic>; lsPrevisaoTempo = jsonResponse.map<Data>((json) => Data.fromJson(json)).toList(); } else { print("请求失败,状态码: ${response.statusCode}"); } }); } catch (e) { print("请求异常: $e"); } }
2. 修正API请求代码
明确返回类型,增加空值校验:
import 'package:http/http.dart' as http; static Future<http.Response> getPredictionTime() async { SharedPreferences pref = await SharedPreferences.getInstance(); var countyId = pref.getInt("county_id"); if (countyId == null) { throw Exception("未找到有效的地区ID"); } Map<String, String> headers = {'Content-Type': 'application/json'}; var url = Uri.parse("https://apiprevmet3.inmet.gov.br/previsao/${countyId}"); return await http.get(url, headers: headers); }
3. 数据模型类保留
你的Data和Periodo模型类符合API返回的字段结构,无需修改,可继续使用。
额外注意事项
- 确保
SharedPreferences中存储的county_id是有效的IBGE地区编码,否则API会返回错误响应。 - 建议在UI层添加加载状态和错误提示,提升用户体验。
内容的提问来源于stack exchange,提问作者João Victor Minervino
相关产品推荐
相关产品推荐

