возвращает логическое значение в асинхронной функции во флаттере

# #firebase #flutter #firebase-authentication

Вопрос:

Я хочу проверить, существует ли пользователь после входа в систему. Я написал код ниже:

 checkIfUserExists() async {
  await Firebase.initializeApp();
  FirebaseAuth.instance.authStateChanges().listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
      return false;
    } else {
      print('User is signed in!');
      return true;
    }
  });
}
 

Функция не может возвращать логическое значение, потому что оно не является пустым, как ожидалось функцией. Мне нужна (чтобы получить дату аутентификации firebase) асинхронная функция. Есть ли способ получить возвращаемое логическое значение из моей функции выше?

Ответ №1:

authStateChanges() Метод возвращает a Stream , в то время async как метод должен возвращать a Future .

Учитывая название checkIfUserExists , кажется, что вас интересует только текущее значение, и в этом случае проще использовать currentUser свойство вместо этого:

 checkIfUserExists() async {
  await Firebase.initializeApp();
  var user = FirebaseAuth.instance.currentUser;
  if (user == null) {
    print('User is currently signed out!');
    return false;
  } else {
    print('User is signed in!');
    return true;
  }
}
 

Если вы вызовете этот код, когда приложение только что запущено , currentUser это все еще может произойти nil , так как Firebase снова проверяет учетные данные пользователя на этом этапе. Если вы хотите дождаться завершения Firebase этой проверки и после этого получить пользователя, вы можете получить первое событие из authStateChanges() потока:

 checkIfUserExists() async {
  await Firebase.initializeApp();
  var user = await FirebaseAuth.instance.authStateChanges().first();
  if (user == null) {
    print('User is currently signed out!');
    return false;
  } else {
    print('User is signed in!');
    return true;
  }
}
 

Комментарии:

1. Спасибо за вашу помощь! Опробовал его вчера, и он отлично работает.

Ответ №2:

 bool checkUserExist()=>FirebaseAuth.instance.currentUser!=null;
 

Комментарии:

1. Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, повысит долгосрочную ценность ответа.