Я добавил вход в 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
он возвращает ноль.
может кто-нибудь сказать мне, где нужно исправить?
Это ожидаемое поведение: хотя аутентификация Firebase автоматически восстанавливает пользователя при перезагрузке, для этого требуется обратиться к серверам (чтобы проверить, например, отключена ли учетная запись), и этот вызов, вероятно, еще не завершен, когда вы получаете доступ auth.currentUser
.
Правильный способ узнать текущего пользователя — прослушать поток authStateChanges
, как показано в этом примере в документации по получению текущего пользователя:
FirebaseAuth.instance
.authStateChanges()
.listen((User? user) {
if (user != null) {
print(user.uid);
}
});
Если вы хотите отобразить это в пользовательском интерфейсе, вам нужно использовать StreamBuilder
и установить для его свойства значение FirebaseAuth.instance.authStateChanges()
.