Flutter登录报错FormatException: Unexpected end of input 求解
解决Flutter登录时的FormatException错误
你遇到的FormatException: Unexpected end of input错误,本质是尝试解析空字符串或非合法JSON格式的响应体导致的,结合你的代码和API地址,按以下步骤排查修复:
1. 先确认API返回的实际内容
在获取响应后立刻打印返回体,明确API到底返回了什么(是空字符串、HTML错误页还是非JSON内容):
var response = await http.post(Uri.parse(puclicUrl), body: <String, String>{ "username": username.text, "password": password.text, }); print('API返回内容: ${response.body}'); // 新增这行打印
执行登录操作后,查看控制台输出,就能定位问题根源——比如可能API返回空字符串、404页面的HTML,或者格式错误的JSON。
2. 调整JSON解析的逻辑顺序
你的代码目前是先解析再判断响应体是否为空,这会直接触发空内容的解析错误。改成先判断非空再解析,同时给解析加单独的异常捕获:
if (response.statusCode == 200) { print('API返回内容: ${response.body}'); if (response.body.isNotEmpty) { try { var data = jsonDecode(response.body); // response.body本身是String,无需toString() // 这里可以加一步判断:比如检查data是否包含预期的登录成功标识(如token、用户ID) Navigator.push( context, MaterialPageRoute(builder: (context) => const HomePage()), ); print("Logged in"); } catch (jsonErr) { print('JSON解析失败: ${jsonErr.toString()}'); } } else { print('API返回空内容,登录逻辑异常'); } } else { print('请求失败,状态码: ${response.statusCode}'); }
3. 检查请求格式是否匹配API要求
你的代码目前用的是form-data格式提交参数,但有些API要求JSON格式的请求体。如果测试后发现API不支持form-data,就修改请求头和body格式:
var response = await http.post( Uri.parse(puclicUrl), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', // 修正原拼写错误的Context-Type }, body: jsonEncode(<String, String>{ "username": username.text, "password": password.text, }), );
注意:这一步需要先通过Postman等工具测试API,确认它接受的参数格式是form-data还是JSON。
4. 清理冗余代码
原代码里有重复的json.decode(response.body)调用,还有注释掉的冗余逻辑,直接删除这些无效代码即可。
内容的提问来源于stack exchange,提问作者Pimpi Rimpà
相关产品推荐
相关产品推荐

