Я запрограммировал приложение, которое требует аутентификации. Я также безопасно сохранил постоянные данные аутентификации на устройстве, поэтому при каждом запуске приложения вход в систему не требуется.
Как только приложение запускается, оно автоматически направляется на основной маршрут (в моем случае это 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.
где числа меняются время от времени , Насколько я понимаю, это предотвращает многократный вызов маршрутов или нарушение работы, связанной с маршрутизацией. Так как я получаю эту ошибку в случайное время, это должно быть связано с асинхронными функциями.
Чтобы завершить мой вопрос: что я делаю здесь неправильно и что является нормой для выполнения вышеизложенного?