16

我在我的 Flutter Web 应用程序上使用 Firebase 身份验证,但在刷新期间会话不会持续存在。

这是我正在使用的包。

https://pub.dev/packages/firebase

这就是我使用 Firebase 进行身份验证的方式

  static Future<User> handleSignInEmail(String email, String password) async {
    await init();

    final UserCredential userCredential =
        await auth().signInWithEmailAndPassword(email.trim(), password);

    assert(userCredential.user != null);
    assert(await userCredential.user.getIdToken() != null);

    final User currentUser = await userCredential.user;
    assert(userCredential.user.uid == currentUser.uid);

    print('signInEmail succeeded: $userCredential.user');

    return userCredential.user;
  }

如果我刷新页面并调用以下方法,则返回的用户为空:

  static Future<User> getFirebaseUser() async {
    await init();
    return await auth().currentUser;
  }

使用 Flutter Mobile 的类似实现按预期工作。我在 Flutter Web 实现中缺少什么?

4

3 回答 3

26

登录是自动发生的,它由 Firebase 处理,但是以异步方式。更多细节可以在官方文档中找到:

https://firebase.google.com/docs/auth/web/auth-state-persistence

诀窍很简单。您需要等待第一次状态更改。

  static Future<User> getFirebaseUser() async {
    await init();
    //return await auth().currentUser;
    return await auth().onAuthStateChanged.first;
  }

null如果没有登录用户,则 返回: https ://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#onauthstatechanged

我的firebase版本:

firebase: 5.0.4 #https://pub.dartlang.org/packages/firebase

我编写了这个适用于移动设备和网络的实现:

  static Future<FirebaseUser> getFirebaseUser() async {
    FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
    if (firebaseUser == null) {
      firebaseUser = await FirebaseAuth.instance.onAuthStateChanged.first;
    }
    return firebaseUser;
  }
于 2019-09-29T19:46:33.737 回答
3

https://stackoverflow.com/a/58158636的扩展

在新的库版本中,onAuthStateChangedgetter 不可用。而不是那个用途authStateChanges()

User firebaseUser = await FirebaseAuth.instance.currentUser;
  if (firebaseUser == null) {
    firebaseUser = await FirebaseAuth.instance.authStateChanges().first;
  }

https://pub.dev/documentation/firebase_auth/latest/firebase_auth/FirebaseAuth/authStateChanges.html

于 2021-10-26T16:49:04.467 回答
2

Firebase 飞镖包

导入此 pub 并检查使用 auth 的操作系统

import 'package:firebase/firebase.dart' as firebase;
import 'package:firebase_auth/firebase_auth.dart';

if(Platform.isIOS || Platform.isAndroid) {
    FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password).then(() {
        //do something
    });
} else {
    firebase.auth().createUserWithEmailAndPassword(email, password).then(() {
        //do something
    });
}
于 2020-07-13T06:06:07.417 回答