You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查JSON API数据数组中是否存在指定注册邮箱项

问题原因

你写的逻辑存在两个致命问题,才会导致邮箱重复时仍然走注册流程:

  • 循环判断逻辑位置错误:遍历用户列表时,只要当前遍历到的单个用户邮箱和输入的邮箱不一致,就会立刻触发SaveUserData(),根本不会等所有用户遍历完。举个例子:如果注册用户列表里第1个邮箱不是你输入的重复邮箱,哪怕第2个就是重复的,代码也会先走到else分支直接保存用户数据。
  • 缺少边界处理:没有判断接口请求是否成功、没有对用户输入的内容做去空格处理,很容易因为接口报错、输入带隐形空格出现匹配失效、程序崩溃的问题。
修复方案

调整遍历逻辑:先遍历完所有用户数据,用标记位记录邮箱是否存在,遍历结束后再统一判断走哪个分支,不要在循环内部直接执行业务跳转。
修复后的代码如下:

CheckEmail() async {
  // 拉取用户列表数据
  var response = await http.get(Uri.parse("http://0.0.0.0:8080/index.php/path=users/"));
  // 先校验接口请求状态
  if (response.statusCode != 200) {
    EasyLoading.showError("网络请求异常,请稍后重试");
    return;
  }
  var data = jsonDecode(response.body) as List;
  bool emailExists = false;
  // 去除输入内容前后的隐形空格,避免空格导致匹配失败
  String inputEmail = _emailController.text.trim();
  // 遍历过程只做存在性标记,不执行业务分支
  for (var a in data) {
    var email = a["email"]?.toString() ?? "";
    if (email == inputEmail) {
      emailExists = true;
      break; // 找到匹配项直接终止循环,减少不必要的性能消耗
    }
  }
  // 遍历全部完成后再统一判断走对应流程
  if (emailExists) {
    EasyLoading.showError("该邮箱已存在,请更换其他邮箱注册");
  } else {
    SaveUserData();
  }
}
额外优化建议
  • 不建议前端拉取全量用户列表做邮箱校验,用户量较大时接口返回数据体积会非常大,性能损耗严重。最好让后端单独提供邮箱查重接口,前端把用户输入的邮箱作为参数传入,后端直接返回是否存在的布尔结果即可,既安全又高效。
  • 发起查重请求前可以先做邮箱格式合法性校验,用正则判断输入内容是否符合邮箱格式,减少无效请求。

内容的提问来源于stack exchange,提问作者abdifatah nour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:24:26