Flutter请求天气API触发Dart Invalid radix-10格式异常
异常根因定位
- 触发异常的核心原因是
Uri.https方法的入参规则使用错误,直接破坏了Dart的URI解析逻辑:Uri.https的第一个参数仅支持传入域名(authority),不允许携带https://协议头、完整路径、查询字符串- 你当前将整段带
https://开头的完整API地址作为第一个参数传入后,Dart在内部解析URI结构时,会尝试把authority字段中//后、:分隔的端口部分解析为十进制整数(对应堆栈中int.parse的调用栈),结果碰到的是完整路径开头的非数字字符串,直接抛出Invalid radix-10 number的格式异常 - 存在额外的代码问题:原代码查询参数中使用了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
相关产品推荐
相关产品推荐

