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
相关产品推荐
相关产品推荐

