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

Flutter调用天气API遇NoSuchMethodError问题求助

解决Flutter调用天气预报API时的NoSuchMethodError错误

错误原因

你遇到的NoSuchMethodError核心问题有两个:

  1. 错误地将API响应解析为Map<String, dynamic>,但实际上该INMET预报API返回的是数组(List),导致后续试图对Map调用仅List支持的map方法失败。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:10:34