rest - 带有 REST 调用的 Flutter onTap 以无限循环结束
问题描述
我喜欢在 Flutter 中创建一个简单的登录。运行代码时,它会陷入无限循环。我已经发现在构建方法中调用 REST API 是“不好的做法”,但我不知道如何避免这种情况。
我该如何解决这个问题?在不设置“构建”方法中的功能的情况下,通过按钮按下/点击来处理 REST 调用的最佳方法是什么?
我的登录视图如下(细节省略):
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
height: MediaQuery.of(context).size.height,
child: Stack(
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_emailPasswordWidget(),
PrimaryButton("Login", true, performLogin),
],
),
),
],
),
)
)
);
主按钮采用 lambda 的地方。
void performLogin(BuildContext context) {
final String userName = _userName.text.trim();
final String password = _password.text.trim();
if(password.isEmpty || userName.isEmpty) {
return;
}
UserService service = UserService();
service.loginUser(userName, password).then((val) {
Navigator.push(
context, MaterialPageRoute(builder: (context) => MainLayout()));
}).catchError((e) {
showDialog(context: context,
builder: (context) {
return AlertDialog(
content: Text("ERROR")
);
});
});
}
这由“PrimaryButton”调用,如下所示:
onTap: widget.onTab(context)
我现在的问题是,每当我按下“登录”按钮时,它都会调用该函数(用于测试,它是错误)并陷入无限错误循环。当我按下某处关闭对话框时,它会再次触发。它似乎也可以一键触发多次。
解决方案
我发现了问题。它不是由代码引起的,而是由onTab
lambda ( service.loginUser
) 中使用的 REST 请求引起的。响应花费的时间比预期的要长,因此调用不会正确返回。
我对这类“错误”请求的 REST 请求使用超时来解决问题。
推荐阅读
- amazon-web-services - 如何通过 ci-cd 管道在图表博物馆中推送 helm 包?
- nginx - Nginx Ingres 仅在到另一台服务器的路径上重定向
- javascript - 我想得到父类
- python - 在 Python 中解释 ffmpeg 输出
- validation - 是否允许对输入元素的 v-model 和验证规则属性使用不同的名称?
- javascript - 为什么无法通过保存在 IndexedDB 中的 emscriptens fopen() 打开文件?
- c++ - 如何填充 std::vector
带文字 - c# - SkiaSharp:多次旋转大图而不会因为内存管理而导致应用程序崩溃
- php - 如何使用 PHP 创建随机密码生成器?
- javascript - 如何确定用户是从 Intranet 还是 Internet 连接