如何在Flutter中从Firebase获取当前用户ID

33

我正在尝试这个 -

final Future<FirebaseUser> user = auth.currentUser();

但问题是,它不是通过“userid”创建文档,而是通过名称创建文档 -

Instance of 'Future<FirebaseUser>'

这实际上是我文档的名称,但我想将其更改为特定的用户ID。

我该怎么做?


1
你明白在Dart中应该如何使用Futures吗? - Doug Stevenson
2
好的,如果你想用Flutter编写应用程序,这是你必须学会的东西。这是关于如何进行异步编程的。如果你不理解这一点,你将无法取得很大进展。 - Doug Stevenson
1
但至少告诉我这个问题的解决方案... - Sabih Khan
1
你需要使用'await'关键字来等待异步操作完成,以获取包含FirebaseUser对象的Future。该FirebaseUser对象将具有用户UID的属性。建议您查阅Flutter的Firebase Auth API文档以获取更多详细信息。 - Doug Stevenson
2
你可能也想阅读这里的内容,以了解Dart中的异步编程。如果没有这些知识,你将无法走得很远:https://www.dartlang.org/tutorials/language/futures - Doug Stevenson
显示剩余2条评论
10个回答

94

更新(2020.09.09)

自firebase_auth 0.18.0版本以后

在firebase_auth 0.18.0中进行了几个重大的更新。FirebaseUser现在称为User,currentUser是一个getter,并且currentUser是同步的。

这使得获取uid的代码像这样:

final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() {
  final User user = auth.currentUser;
  final uid = user.uid;
  // here you write the codes to input the data into firestore
}

在 firebase_auth 版本 0.18.0 之前

uid 是 FirebaseUser 对象的一个属性。由于 auth.currentUser() 返回一个 future,您需要等待才能获取用户对象,代码如下:

final FirebaseAuth auth = FirebaseAuth.instance;

Future<void> inputData() async {
  final FirebaseUser user = await auth.currentUser();
  final uid = user.uid;
  // here you write the codes to input the data into firestore
}

4
谢谢!哇,刚接触Flutter,发现过时的教程让人非常困惑。我希望能得到更好理解的指导。 - martin
1
@martin 我听到你的声音了。FlutterFire插件中的重大更改是比较近期的,因此过时的文档更新可能需要一些时间... - dshukertjr
3
我一直在学习Angela Yu的Flutter课程。尽管它已经过时,但我认为还是很好的。我能够轻松地学完每个模块,只需稍加调整即可。但在第15个模块中,有一步对我来说真的很令人困惑。通过比较Firebase废弃的代码和新代码,我解决了身份验证问题。谢谢! - Camilo Lizarazo Olaya
1
VS Code一直显示关于invalid_assignment的错误,为了解决它,我不得不在currentUser后面加上!,就像这样:final User user = auth.currentUser!; - Waqleh

5
final FirebaseAuth _auth = FirebaseAuth.instance;
getCurrentUser() async {
    final FirebaseUser user = await _auth.currentUser();
    final uid = user.uid;
    // Similarly we can get email as well
    //final uemail = user.email;
    print(uid);
    //print(uemail);
  }

调用函数getCurrentUser以获取结果。例如,我使用了一个按钮:

RaisedButton(
              onPressed: getCurrentUser,
              child: Text('Details'),
            ),

更新:自 firebase_auth 0.18.0 版本以来,FirebaseUser 类已更名为 User。因此,如果您在尝试使用 FirebaseAuth.instance.currentUser.uid.toString() 检索当前用户的 ID 时遇到错误消息“表达式不评估为函数,因此无法调用”,则需要将代码更新为以下内容:Future<String> inputData() async { final User user = await FirebaseAuth.instance.currentUser!; final String uid = user.uid.toString(); return uid; } - mabt

5

如果您使用 Google 登录,则会获取用户的以下信息。

final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();
void initState(){
super.initState();
 firebaseAuth.onAuthStateChanged
        .firstWhere((user) => user != null)
        .then((user) {
      String user_Name = user.displayName;
      String image_Url = user.photoUrl;
      String email_Id = user.email;
      String user_Uuid = user.uid; // etc
      }
       // Give the navigation animations, etc, some time to finish
    new Future.delayed(new Duration(seconds: 2))
        .then((_) => signInWithGoogle());
        }

     Future<FirebaseUser> signInWithGoogle() async {
  // Attempt to get the currently authenticated user
  GoogleSignInAccount currentUser = _googleSignIn.currentUser;
  if (currentUser == null) {
    // Attempt to sign in without user interaction
    currentUser = await _googleSignIn.signInSilently();
  }
  if (currentUser == null) {
    // Force the user to interactively sign in
    currentUser = await _googleSignIn.signIn();
  }

  final GoogleSignInAuthentication googleAuth =
      await currentUser.authentication;

  // Authenticate with firebase
  final FirebaseUser user = await firebaseAuth.signInWithGoogle(
    idToken: googleAuth.idToken,
    accessToken: googleAuth.accessToken,
  );

  assert(user != null);
  assert(!user.isAnonymous);

  return user;
}

5

您需要等待异步操作完成。

final FirebaseUser user = await auth.currentUser();
final userid = user.uid;

或者您可以使用then风格的语法:
final FirebaseUser user = auth.currentUser().then((FirebaseUser user) {
  final userid = user.uid;
  // rest of the code|  do stuff
});

获取 Firebase 的 currentUser 是同步的。 - Davoud Badamchi
@DavoudBadamchi 为什么是同步的?我们不需要等待来自Firebase 的响应吗?var user = await FirebaseAuth.instance.currentUser! 不正确吗? - Sunshine
在哪里使用这个?我的意思是我可以登录主页。我需要添加这段代码的地方。一头雾水,请告诉我。 - Learning Curious
自 firebase_auth 0.18.0 版本开始,FirebaseUser 类已更改为 User - mabt

4

更新(空值安全)

要获取用户的uid、电子邮件和其他信息,请检查用户是否已登录,然后从User类中检索这些值。

User? user = FirebaseAuth.instance.currentUser;

// Check if the user is signed in
if (user != null) {
  String uid = user.uid; // <-- User ID
  String? email = user.email; // <-- Their email
}

2
这是另一种解决方法:

这里有一个替代方案:

Future<String> inputData() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    final String uid = user.uid.toString();
  return uid;
  }

it returns the uid as a String


除非我错了,它仍然会返回一个Future,对吗?即使它是String类型?你仍然需要在另一端处理它。 - ConleeC
自从 firebase_auth 0.18.0 版本起,类 FirebaseUser 已更改为 User - mabt

1

你也可以尝试这个。

     currentUser() {
         final User user = _firebaseAuth.currentUser;
         final uid = user.uid.toString();
         return uid;
      }

现在只需在您的代码中调用currentUser(),它将返回当前登录用户的uid。
    uid=FirebaseAuthService().currentUser();

1

在你的Flutter小部件之前,你可以将这个添加到全局状态中。

final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final myUid = user.uid;

这将使得myUid在此情况下可用。


1

通常情况下,它总是会返回。

Instance of 'Future<FirebaseUser>'

尝试使用如下的.then:
在您的authservice类中首先创建函数。
Future<String> getCurrentUID() async{
    final FirebaseUser user = await _auth.currentUser();
    final String uid = user.uid;
    return uid;
  }

然后在需要该ID的位置调用此函数,如下所示

Widget build(BuildContext context) {
    void getid(String foo) {
      userID = foo;
    }

    AuthService().getCurrentUID().then((value) => getid(value));

    return Scaffold(
      ...
    );
}

这是获取ID最方便的方法。您也可以像这样获取电子邮件和手机号码。


这个不行。我刚刚用我的代码尝试了一下,它会给出相同的 Future<void> 实例。 - hermie_brown
你首先创建了userID成为全局变量吗?...你只能通过使用.then()来做到这一点。 - OmkarKhilari

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接