Flutter注册页遇FormatException错误,数据无法插入本地数据库求助
解决Flutter注册页面插入数据时的FormatException错误
错误根源分析
FormatException: Unexpected end of input 本质是你尝试解析的HTTP响应不是有效JSON格式,大概率是服务器端PHP脚本未返回标准JSON,或是返回了空内容、错误提示文本。结合你的代码,还有几处明显逻辑问题需要修正:
分步修复方案
1. 修正表单验证逻辑
你当前用||(或)判断字段是否为空,这会导致只要有一个字段不为空就提交请求,空数据传到服务器后触发PHP错误,返回非JSON内容。必须改成&&(且),确保所有必填字段都已填写:
if(nama.text.isNotEmpty && email.text.isNotEmpty && password.text.isNotEmpty ){ // 提交请求逻辑 }else{ print("请填写所有必填字段"); }
(推荐用isNotEmpty替代!="",更符合Dart代码规范)
2. 先校验响应再解析JSON
在调用jsonDecode前,必须先检查HTTP响应状态码和内容是否有效,避免解析空内容或错误内容:
var res = await http.post(Uri.parse(uri), body: { "nama": nama.text, "email": email.text, "password": password.text }); // 先判断HTTP请求是否成功 if (res.statusCode == 200) { // 确保响应内容非空再解析 if (res.body.isNotEmpty) { try { var response = jsonDecode(res.body); // 注意:如果PHP返回的是布尔值,不要用字符串"true"比较 if(response["success"] == true){ print("数据保存成功"); // 只有插入成功才跳转页面 Navigator.push( context, MaterialPageRoute(builder: (context) => const MainHome()), ); }else{ print("数据保存失败: ${response["message"] ?? "未知错误"}"); } } catch (e) { print("JSON解析错误: $e"); print("服务器返回内容: ${res.body}"); // 打印返回内容方便排查问题 } } else { print("服务器返回空内容"); } } else { print("HTTP请求失败,状态码: ${res.statusCode}"); }
3. 调整页面跳转时机
你当前调用insertrecord()后立刻跳转,完全不等待请求结果。必须把跳转逻辑放在请求成功的分支里,确保数据插入完成后再跳转到首页。
4. 检查服务器端PHP脚本(核心)
这是最可能的问题根源,确保insert_data.php满足以下要求:
- 无论成功/失败,都返回标准JSON格式,示例:
// 插入成功时 echo json_encode(["success" => true, "message" => "数据插入成功"]); // 插入失败时 echo json_encode(["success" => false, "message" => "数据库连接失败"]); - 禁止输出任何额外内容(比如调试echo、HTML错误页面),否则会破坏JSON结构。
- 直接用Postman或浏览器模拟POST请求,查看PHP返回的内容是否为有效JSON,排查数据库连接、SQL语法等问题。
额外优化建议
- 将
RegisterPage改为StatefulWidget,或使用Form组件配合GlobalKey实现更严谨的表单验证(比如邮箱格式校验)。 - 给密码输入框添加
obscureText: true属性,隐藏密码输入内容。 - 提交请求时添加加载状态,防止用户重复点击按钮。
内容的提问来源于stack exchange,提问作者Rahmat285
相关产品推荐
相关产品推荐

