首页 > 解决方案 > 带有 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)

我现在的问题是,每当我按下“登录”按钮时,它都会调用该函数(用于测试,它是错误)并陷入无限错误循环。当我按下某处关闭对话框时,它会再次触发。它似乎也可以一键触发多次。

标签: restflutter

解决方案


我发现了问题。它不是由代码引起的,而是由onTablambda ( service.loginUser) 中使用的 REST 请求引起的。响应花费的时间比预期的要长,因此调用不会正确返回。

我对这类“错误”请求的 REST 请求使用超时来解决问题。


推荐阅读