You need to enable JavaScript to run this app. Flutter请求天气API触发Dart Invalid radix-10格式异常
优惠活动
大模型
产品
解决方案
定价
更多

Flutter请求天气API触发Dart Invalid radix-10格式异常

异常根因定位
  • 触发异常的核心原因是Uri.https方法的入参规则使用错误,直接破坏了Dart的URI解析逻辑:
    1. Uri.https的第一个参数仅支持传入域名(authority),不允许携带https://协议头、完整路径、查询字符串
    2. 你当前将整段带https://开头的完整API地址作为第一个参数传入后,Dart在内部解析URI结构时,会尝试把authority字段中//后、:分隔的端口部分解析为十进制整数(对应堆栈中int.parse的调用栈),结果碰到的是完整路径开头的非数字字符串,直接抛出Invalid radix-10 number的格式异常
    3. 存在额外的代码问题:原代码查询参数中使用了HTML转义的&代替普通&,手写拼接的路径参数也存在转义错误;同时给Uri.https的第二个路径参数传入了和天气业务无关的albums/1,即使解决格式异常,也无法请求到正确的天气接口数据
可落地的修复方案
  • 方案1:严格匹配Uri.https的方法签名拆分URL结构,自动处理参数编码:
    void getData() async {
      const String host = 'api.openweathermap.org';
      const String path = 'data/2.5/weather';
      final Map<String, String> queryParams = {
        'lat': '35',
        'lon': '139',
        'appid': '4659036c323608514eb865c174726965'
      };
      final requestUri = Uri.https(host, path, queryParams);
      http.Response response = await http.get(requestUri);
      if (response.statusCode == 200) {
        print(response.body);
      }
    }
    
  • 方案2:如果不想手动拆分URL结构,直接用Uri.parse加载完整地址,跳过Uri.https的结构拆分逻辑:
    void getData() async {
      const String apiUrl = 'https://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=4659036c323608514eb865c174726965';
      http.Response response = await http.get(Uri.parse(apiUrl));
      if (response.statusCode == 200) {
        print(response.body);
      }
    }
    
  • 代码优化提示:当前网络请求逻辑直接写在build方法内,会在组件每次重建时重复触发网络请求,建议将请求调用移到initState或交互回调中,减少无效请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 01:54:05