Flutter报错:Expected a value of type 'int', but got one of type 'String'
报错原因
- 核心触发原因:
RequestAssist类的getReqeust方法中,判断请求成功的条件写为if (response == 200),这里response是http.Response类型的对象,不能直接和int类型的状态码200做等值判断,类型不匹配直接触发了该报错。 - 同时存在多个隐藏问题会导致功能无法正常运行:
- Google Geocode API的请求URL拼接不符合官方规则,正确的参数格式应为
?latlng=纬度,经度&key=密钥,当前参数拼接错误会导致请求直接返回失败 - 错误取用了
position.altitude(海拔值),地址解析需要的是position.longitude(经度值) - 请求失败的返回值拼写和外层判断的字符串拼写不一致,就算请求成功也无法进入取值分支
- 未对返回的JSON结构做判空处理,直接嵌套取值容易触发空安全异常
- Google Geocode API的请求URL拼接不符合官方规则,正确的参数格式应为
修复方案
按照下方代码修正逻辑即可:
import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:geolocator/geolocator.dart'; // 替换为你自己的Google地图服务密钥 const String mapKey = "你的谷歌地图密钥"; class AssiMethod { static Future<String> searchCooredinationAdress(Position position) async { String addressPlace = ""; // 修正URL参数拼接规则,替换altitude为longitude String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=${position.latitude},${position.longitude}&key=$mapKey"; var response = await RequestAssist.getRequest(url); // 先判断返回值类型,再校验接口返回状态 if (response is Map && response["status"] == "OK") { // 增加数组判空逻辑,避免空异常 if(response["results"] != null && (response["results"] as List).isNotEmpty) { addressPlace = response["results"][0]["formatted_address"] ?? ""; } } return addressPlace; } } class RequestAssist { // 修正方法名拼写错误 static Future<dynamic> getRequest(String url) async { try { http.Response response = await http.get(Uri.parse(url)); // 修正:取statusCode属性和状态码200对比 if (response.statusCode == 200) { String jsonData = response.body; var decoData = jsonDecode(jsonData); return decoData; } else { return "echec de repense"; } } catch (exp) { return "echec"; } } } // 调用代码示例 // String adresse = await AssiMethod.searchCooredinationAdress(position); // print("adresse $adresse");
内容的提问来源于stack exchange,提问作者oussama.alouache
相关产品推荐
相关产品推荐

