Вошёл в систему, но не могу получить данные пользователя

Я добавил вход в Google в свой веб-проект Flutter, и при первом запуске кода я успешно вхожу в систему. Но после обновления или горячего перезапуска данные currentUser будут иметь значение null.

loginWithGoogle(context) async {
    try {
      if (kIsWeb) {
        googleSignIn = GoogleSignIn(
            clientId:
                'client-id.apps.googleusercontent.com');

        GoogleSignInAccount? googleSignInAccount = kIsWeb
            ? await (googleSignIn.signInSilently())
            : await (googleSignIn.signIn());

        if (kIsWeb && googleSignInAccount == null) {
          googleSignInAccount = await (googleSignIn.signIn());
        }
        googleSignIn.onCurrentUserChanged
            .listen((GoogleSignInAccount? account) {
          // save login info
        });
        bool isSigned = await googleSignIn.isSignedIn();
        if (isSigned) {
          // save login info when user has logged in
          final User? currentUser = auth.currentUser;
          print(currentUser?.email);
        }
      } else {
        // handle login for android device
    } catch (e) {
      Get.snackbar('Firebase error', e.toString());
    }
  }

Эта функция используется для Интернета и устройств Android, в Android она может работать плавно, но когда я запускаю в Chrome-Web, мне удается получить пользователя, когда я впервые запускаю код, но после горячего обновления он не может получить пользовательские данные .

При вызове isSignedIn() он возвращает истинное значение, но при вызове currentUser?.email он возвращает ноль.

может кто-нибудь сказать мне, где нужно исправить?


50
1

Ответ:

Решено

Это ожидаемое поведение: хотя аутентификация Firebase автоматически восстанавливает пользователя при перезагрузке, для этого требуется обратиться к серверам (чтобы проверить, например, отключена ли учетная запись), и этот вызов, вероятно, еще не завершен, когда вы получаете доступ auth.currentUser .

Правильный способ узнать текущего пользователя — прослушать поток authStateChanges, как показано в этом примере в документации по получению текущего пользователя:

FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) {
    if (user != null) {
      print(user.uid);
    }
  });

Если вы хотите отобразить это в пользовательском интерфейсе, вам нужно использовать StreamBuilder и установить для его свойства значение FirebaseAuth.instance.authStateChanges().