После этого сообщения в блоге: https://blog.ishangavidusha.com/flutter-authentication-flow-with-go-router-and-provider
Я реализовал приложение флаттера, используя маршрутизатор go. Я добавил обработчик аутентификации firebase в initState()
моем приложении флаттера:
@override
void initState() {
appService = AppService(widget.sharedPreferences);
authService = AuthService();
authSubscription = authService.onAuthStateChange.listen(onAuthStateChange);
super.initState();
}
Здесь, в моем классе authservice, у меня есть такой конструктор:
AuthService() {
authSubscription =
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
//appService.loginState = false;
print('User is currently signed out!');
_onAuthStateChange.add(false);
} else {
//appService.loginState = true;
print('User is signed in!');
_onAuthStateChange.add(true);
}
});
}
Все работает нормально. Когда я что-то меняю в своем приложении и сохраняю изменения, приложение выполняет горячую перезагрузку. Похоже, что горячая перезагрузка сохраняет активным предыдущий обработчик событий, поскольку после каждой горячей перезагрузки у меня есть еще один вызов моего authStateChanges
обработчика событий, когда я выполняю задачу входа в систему. После горячей перезагрузки у меня будет два оператора печати print('User is signed in!');
после входа в систему. И еще по одной после каждой горячей перезагрузки.
Является ли это приемлемым поведением для разработки или мое приложение спроектировано неправильно?
Решение проблемы
Во время горячей перезагрузки состояние остается активным, поэтому ваш initState
метод не должен вызываться снова после перезагрузки. Вы можете проверить это с помощью отладчика или оператора печати.
Если это так, то что-то не идеально в вашем дереве виджетов.
Распространенным шаблоном является реализация dispose
метода в таком классе службы, который отменяет подписку. Затем вызовите его из dispose
метода состояний, чтобы очистить службу.
Если это приемлемо, зависит от вашего определения качества. Скорее всего, это означает, что что-то не так, что может произойти из-за какой-то дикой перестройки в рабочей среде. Настоятельно рекомендую вам попытаться понять, что происходит, и исправить это.
Комментариев нет:
Отправить комментарий