Многое происходит. Как правило, вы не обновляете объект state
методом setState()
. setState
используется, чтобы сообщить виджету, что некоторые state
изменились - и он называется синхронно с изменением, но здесь вы просто проверяете, существует ли документ и ничего не меняется, это не нужно.
Также не похоже, что вы вообще возвращаете объект user
, поэтому этот код, который я прочитал, всегда будет возвращать false
.
- Вы должны полностью удалить
setState
здесь (не нужно для того, что вы делаете) - Запустить метод входа, который возвращает объект пользователя, с которым вы хотите что-то делать.
- Получите доступ к вашей БД, как только узнаете, что у вас есть вошедший в систему пользователь (т.е. без идентификатора вошедшего в систему пользователя)
Вот вариант, который можно попробовать:
//Create a User class so that you don't have to call FireBase in your methods.
class User {
User({
@required this.uid,
this.email,
this.displayName,
});
final String uid;
final String email;//these are whatever you want
final String displayName;
}
//put sign in methods into an abstract class. Don't have to, but keeps code flexible if you don't stay with firebase
abstract class AuthBase {
//add in other signin methods as needed
Future<User> signInWithGoogle();
}
//Implement AuthBase in class Auth
class Auth implements AuthBase {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
//Get a User from Firebase User
User _userFromFirebase(FirebaseUser user) {
if (user == null) {
return null;
}
return User(
uid: user.uid,
displayName: user.displayName,
email: user.email,
);
}
//your signinWithGoogle method
Future<User> signInWithGoogle() async {
//where User is the class you've created
GoogleSignIn googleSignIn = GoogleSignIn();
GoogleSignInAccount googleUser = await googleSignIn.signIn();
if (googleUser != null) {
GoogleSignInAuthentication googleAuth = await googleUser.authentication;
if (googleAuth.idToken != null && googleAuth.accessToken != null) {
final authResult = await _firebaseAuth.signInWithCredential( //await your instance of FirebaseAuth
GoogleAuthProvider.getCredential(
idToken: googleAuth.idToken,
accessToken: googleAuth.accessToken,
),
);
return _userFromFirebase(authResult.user); //your signed in firebase user that you can do stuff with uid, email, displayname, etc.
} else {
throw PlatformException(
code: 'ERROR_MISSING_GOOGLE_AUTH_TOKEN',
message: '',
);
}
} else {
throw PlatformException(
code: 'ERROR_ABORTED_BY_USER',
message: '',
);
}
}