Flutter firebase вошедший в систему пользователь возвращает NULL currentUser после входа в систему

Dec 10 2020

При аутентификации в firebase с использованием API signInWithEmailAndPassword () я не могу получить действительного «текущего» пользователя.

  1. Я вхожу в приложение под именем пользователя и паролем
auth.signInWithEmailAndPassword()
  1. Как только я вошел в систему, пользователь попадает на главную страницу

  2. Я пытаюсь получить UID пользователя, но действительный пользователь не вернулся. Вызов происходит в асинхронной функции как таковой:

currentUser = await auth.currentUser();

currentUser имеет значение null.

Есть идеи, что могло быть причиной этого?

Ответы

1 Keita Dec 10 2020 at 00:08

Что, если вы перезагрузите возвращенный FirebaseUser? Это сработало для меня.

const User currentUser = await auth.currentUser;
if (currentUser != null) {
  await currentUser.reload();
}

Явно упрощенный код. Примечание: auth.currentUser () теперь auth.currentUser.

Это может быть дубликат: Flutter Firebase Authentication currentUser () возвращает null .

1 DougStevenson Dec 10 2020 at 00:10

В документации предлагается использовать наблюдателя состояния аутентификации для получения обратного вызова, когда пользователь вошел в систему и доступен объект User. Как показано в связанной документации:

FirebaseAuth.instance
  .authStateChanges()
  .listen((User user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

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

HarshSingh Dec 19 2020 at 03:10

после получения пользователя просто перезагрузите его, как только он решит ваш код проблемы для справки: D

final FirebaseAuth _auth = FirebaseAuth.instance;
  User currentuser;
  bool isloggedin= false;
  getUser() async{

    User user =  _auth.currentUser;
    await user?.reload();
    user =  _auth.currentUser;

    if(user !=null)
    {
      setState(() {
        this.currentuser = user;
        this.isloggedin=true;
      });
    }
  }