Флаттер не улавливает выход из базы - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь реализовать авторизацию Firebase в Flutter. Я могу войти в систему и перейти на новый экран успешно, однако при попытке выйти из системы я вижу активность в logcat, указывающую:

Logcat event for firebase signout

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

Loggedin screen

Пользователь нажимает кнопку выхода из системы, но я ожидаю, что виджет обновится до следующего:

Logged Out Screen

Моя функция то, что я призываю к выходу из системы, выглядит следующим образом и отображается в виджете моей домашней страницы

class _MainActivityState extends State<MainActivity> {

        var  userStatus = FirebaseAuth.instance.currentUser();


  Future logout()
  async{
     final FirebaseAuth auth = FirebaseAuth.instance;
     await auth.signOut();
Navigator.push(context,MaterialPageRoute(builder: (context) => MainActivity())
);


    return userStatus = null;
}

Далее в моем коде я использую оператор if (который работает, если я вручную перезаписываю вход / выход из системы с помощью строка) для переключения между виджетами, основанными на userStatus, следующим образом:

if(userStatus != null)
                  Container(
//Some code here for the widget showing login button.
)

или в случае выхода из системы:

if(userStatus == null)
                  Container(
//Some code here for the widget showing login button
 )

У меня есть отдельная страница входа, где я первоначально выполнил вход, но авторизация статус, кажется, сохраняется для всего приложения.

Как переопределить, так как Auth.signout() не обновляет статус пользователя.

Ответы [ 2 ]

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

Это может быть проблемой, когда вы устанавливаете переменную на FirebaseAuth.instance.currentUser();, которая возвращает Future, но не ожидает значения перед созданием вашего виджета. Из-за этого он не будет нулевым, но состояние Future ожидает завершения, поэтому ваше условие никогда не будет правильно оценивать нулевое значение.

Чтобы исправить это, давайте инициализируем userStatus в методе initState, поэтому он инициализируется только один раз с Функция asyn c для восстановления после завершения Future. Затем в вашем методе выхода из системы просто вызовите эту функцию, чтобы сбросить userStatus и перестроить виджет с помощью setState:


var userStatus;
@override
void initState() {
    super.initState();
    setUserStatus();
}

Future<void> setUserStatus() async {
  userStatus = await FirebaseAuth.instance.currentUser();
  setState(() {});
}

Future<void> logout() async {
  await FirebaseAuth.instance.signOut();
  setUserStatus();
}
0 голосов
/ 22 апреля 2020

После того, как вы выйдете из системы с помощью этого кода:

final FirebaseAuth auth = FirebaseAuth.instance;
await auth.signOut();

Зачем вам переходить на ту же активность (экран)? Просто заново создайте экран, используя setState, и назначьте новый userStatus:

setState(() { userStatus = null; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...