Асинхронно перейти на другую страницу - PullRequest
0 голосов
/ 19 апреля 2020

Я запрограммировал приложение, которое требует аутентификации. Я также безопасно сохранил постоянные данные аутентификации на устройстве, поэтому при каждом запуске приложения вход в систему не требуется.

Как только приложение запускается, оно автоматически направляется на основной маршрут (в моем случае это spla sh без сохранения состояния). Выполняется следующий код:

  @override
  Widget build(BuildContext context) {
        ifLoggedIn(context);
      return Scaffold(
          body: Center(
              child: Image.asset("assets/logo-sm.png", width: 200,),
          ),
      );
  }
    void ifLoggedIn(context) async {
        if (User.user != null) { // in case of a hot reload resetting the damn app
            Navigator.of(context).push(right(PublicStart()));
        } else {
            User user = await User.loginFromSafeStorage(context); // login from safe storage
            if (user != null)
                Navigator.of(context).push(right(PublicStart()));
            else // nope, no credentials found, redirect to the start-screen
                Navigator.of(context).push(up(SignInScreen()));
        }
    }

функция ifLoggedIn(context) является асинхронной функцией, которая проверяет, были ли данные для входа уже сохранены локально. Если это так, то он будет аутентифицировать пользователя.

Этот процесс выглядит следующим образом:

Case: Logindata found -> Login user and navigate to the start-screen
Case: No logindata found -> Navigate to the sign-in-screen.

Как видите, поскольку эта функция асинхронная, Scaffold ниже возвращается, и процесс сборки этого виджета без сохранения состояния не прерывается. Но ...

, очевидно, setState был вызван во время сборки этого виджета. Я не знаю, как и почему, но, похоже, это случилось. Я пытался исправить эту проблему, но это не первый раз, когда это происходит, и у меня плохое предчувствие, что я применяю плохие методы при разработке этого приложения.

Я подозреваю, что оно что-то сделать с проверкой для вошедшего в систему пользователя.

Другая ошибка, которую я получаю много (и я имею в виду, действительно много) в случайные моменты времени, заключается в следующем: Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line <insert number> pos <insert number>: '!_debugLocked': is not true. где числа меняются время от времени , Насколько я понимаю, это предотвращает многократный вызов маршрутов или нарушение работы, связанной с маршрутизацией. Так как я получаю эту ошибку в случайное время, это должно быть связано с асинхронными функциями.

Чтобы завершить мой вопрос: что я делаю здесь неправильно и что является нормой для выполнения вышеизложенного?

1 Ответ

1 голос
/ 19 апреля 2020

Редактировать (дополнительные пояснения):

Асинхронные вызовы не должны запускаться из метода сборки, так как он (метод сборки) может вызываться много раз по разным причинам, поэтому вы не хотите, чтобы ваш код выполнялся несколько раз, так как это приведет к нежелательным результатам

. Решение состоит в том, чтобы использовать виджет с отслеживанием состояния и выполнить код, который должен запускаться один раз (в вашем случае код, проверяющий состояние аутентификации) из там (из initState() предпочтительно)

также взгляните на этот ответ

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