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

Flutter登录函数点击一次后无限调用问题求助

问题原因与解决方案

问题根源

你的登录函数无限调用,是因为在else分支的最后写了return logins();——这行代码会让函数在完成一次API请求后递归调用自身,形成无限循环,哪怕登录成功跳转到首页,递归逻辑已经触发,会持续调用函数。

修改后的代码

把递归调用的代码去掉,换成对应场景的返回值即可:

Future<Login?> logins() async {
  print("login function called");
  String uemail = emailText.text;
  String upassword = passwordText.text;

  print("Email: $uemail, Pass: $upassword");

  if (uemail.isEmpty || uemail == null) {
    print('enter your email');
    return null; // 空邮箱场景返回null
  } else if (upassword.isEmpty || upassword == null) {
    print('enter your password');
    return null; // 空密码场景返回null
  } else {
    Uri myUri = Uri.parse("http://192.168.29.248:5000/login");
    var json_body = {'email': uemail, 'password': upassword};

    var response = await http.post(myUri, body: json_body);
    print('response code ' + response.statusCode.toString());
    if (response.statusCode == 200) {
      var res = json.decode(response.body);
      print('response res' + res.toString());
      login = Login.fromJson(res);
      if (login?.success == 0) {
        print('enter email');
      } else if (login?.success == 2) {
        print('enter password');
      } else if (login?.success == 1) {
        print('login success');
        Navigator.push(
            context, MaterialPageRoute(builder: (context) => HomeScreen()));
      }
    }
    return login; // 返回当前登录结果对象,不再递归
  }
}

额外建议

  • 不要用print做用户提示,换成Flutter的SnackBar或第三方Toast插件,用户能直观看到错误信息
  • 可以给按钮添加加载状态,防止用户重复点击(比如点击后禁用按钮,请求完成再恢复)

内容的提问来源于stack exchange,提问作者Gajendra Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:15