Flutter发起GET请求时报错Expected a value of type 'String', but got one of type 'Null'如何解决
报错原因
- 该错误是Dart空安全校验触发的类型不匹配问题:代码中声明了非空
String类型的变量/字段,但实际赋值时拿到了Null类型的值,二者类型不兼容导致抛出异常。 - 常见触发场景:
- 接口返回的JSON结构中,你预设一定存在的字符串字段实际不存在/返回了null,解析时直接强转为
String类型 - GET请求本身失败(如无网络、接口返回4xx/5xx状态码),返回的响应体为null,你直接按照字符串处理
- 拼接请求URL时用到了可能为null的动态参数,未判空就直接拼接到字符串中
- 接口返回的JSON结构中,你预设一定存在的字符串字段实际不存在/返回了null,解析时直接强转为
解决方法
- 给请求逻辑加全链路异常校验
使用try-catch包裹请求代码,先判断响应状态码为成功后再处理返回内容:
import 'package:http/http.dart' as http; try { final response = await http.get(Uri.parse("你的请求URL")); if (response.statusCode == 200) { // 解析response.body的逻辑 } else { print("请求异常,状态码:${response.statusCode}"); } } catch (e) { print("请求报错:$e"); }
- JSON解析时对字符串字段做空兼容处理
不要直接把JSON字段强转为非空String,可选择声明可空类型,或者给空值设置兜底默认值:
// 错误写法 String userName = json["user_name"] as String; // 正确写法1:声明为可空字符串 String? userName = json["user_name"] as String?; // 正确写法2:空值时使用默认值 String userName = json["user_name"] as String? ?? "匿名用户";
- 动态拼接URL前先校验参数非空
如果你的请求URL包含动态传入的参数,拼接前先判断参数不为空再执行后续请求逻辑:
String? userId = getUserId(); // 先判空再拼接 if (userId == null) { print("用户ID为空,无法发起请求"); return; } String requestUrl = "https://xxx.com/api/user?user_id=$userId";
内容的提问来源于stack exchange,提问作者francesco
相关产品推荐
相关产品推荐

