Flutter对接登录API带参仍提示邮箱密码必填的解决
Flutter登录接口对接报错修复方案
问题根因
从日志和代码可定位两处核心错误,直接导致服务器收不到有效参数、判断逻辑失效:
- 请求体传值错误,最终提交到服务器的是空内容
- 响应判断逻辑完全不匹配后端返回的JSON结构
具体修复步骤
1. 修正请求传参逻辑
你当前代码的请求行存在明显错误:
var response = await http.post(url, body: json.encode(data[email]));
这里data[email]是把你输入的邮箱字符串(比如rashid.david12@gmail.com)作为key去取data字典的值,但data字典的键只有email、password,不存在对应邮箱字符串的键,最终取到的值是null,相当于给服务器传了空请求体,才会触发“email、password字段必填”的报错。
根据接口实际接收格式调整传参(从报错格式可判断是Laravel风格接口):
- 若接口接收表单格式(
application/x-www-form-urlencoded,Laravel默认接收格式),直接传完整数据字典即可:var response = await http.post( Uri.parse(url), body: data, ); - 若接口要求接收JSON格式,需添加JSON请求头,编码完整数据字典:
var response = await http.post( Uri.parse(url), headers: {'Content-Type': 'application/json'}, body: json.encode(data), );
注意:http包新版本要求传入的地址必须转为Uri类型,不能直接传字符串,否则会触发参数格式错误。
2. 重写响应判断逻辑
你当前代码直接把解析后的JSON结果和字符串'success'对比,但后端实际返回结构为:
- 失败时返回带
errors字段的错误对象(和你日志里打印的结构一致) - 成功时一般返回包含登录token、用户信息的JSON对象,并非纯字符串
正确处理逻辑参考:
// 解析服务器返回数据 final responseData = jsonDecode(response.body); // 登录成功判断:状态码正常且无错误字段 if (response.statusCode == 200 && responseData['errors'] == null) { setState(() => visible = false); Navigator.pushNamed(context, '/home'); } else { // 登录失败处理:提取错误信息并提示 setState(() => visible = false); final errMsg = (responseData['errors'] as List).join('\n'); showDialog( context: context, builder: (context) => AlertDialog( title: const Text('登录失败'), content: Text(errMsg), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('确定'), ) ], ), ); }
3. 补充配置(必做)
因为接口用的是http://明文地址,Android 9+默认禁止明文流量传输,需要在android/app/src/main/AndroidManifest.xml的<application>标签下添加配置:
android:usesCleartextTraffic="true"
否则就算参数修正完成,请求也可能被系统拦截无法发出。
内容的提问来源于stack exchange,提问作者r3klaw
相关产品推荐
相关产品推荐

