Flutter onTap с вызовом REST заканчивается в бесконечном цикле - PullRequest
1 голос
/ 06 апреля 2020

Мне нравится создавать простой логин в Flutter. При запуске кода он застревает в бесконечности l oop. Я уже обнаружил, что вызывать REST API в методе сборки - это «плохая практика», но я не знаю, как этого избежать.

Как я могу решить эту проблему? Каков наилучший способ обработки вызовов REST нажатием / нажатием кнопки без настройки функциональности в методе «build»?

Мой вид входа в систему выглядит следующим образом (детали опущены):

  @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),
                      ],
                    ),
                  ),
                ],
              ),
            )
        )
    );

Где основная кнопка занимает лямбду.

  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)

Моя проблема сейчас заключается в том, что всякий раз, когда я нажимаю кнопку "Логин", он вызывает функцию (для тестирования , это ошибка) и застревает в бесконечной ОШИБКЕ l oop. Когда я нажимаю где-нибудь, чтобы закрыть диалог, он снова запускается. Похоже, что он запускается несколько раз одним щелчком мыши.

1 Ответ

0 голосов
/ 15 апреля 2020

Я нашел проблему. Это вызвано не кодом, а используемым запросом REST в onTab лямбде (service.loginUser). Ответ занимает намного больше времени, чем ожидалось, и, следовательно, вызов не возвращается правильно.

Я использую тайм-аут в запросе REST для таких «ложных» запросов, чтобы решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...