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

Posted

技术标签:

【中文标题】如何在 Flutter 中从 Firebase 获取当前用户 ID【英文标题】:How to get the current user id from Firebase in Flutter 【发布时间】:2019-05-28 18:36:55 【问题描述】:

我正在尝试这个 -

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

但问题是,不是通过“用户 ID”创建文档,而是通过 - 的名称创建文档 -

Instance of 'Future<FirebaseUser>'

这实际上是我现在的文档名称,但我想专门将其设为用户 ID。

我该怎么办?

【问题讨论】:

你明白你应该如何在 dart 中使用 Futures 吗? 好的,如果您想使用 Flutter 编写应用程序,您必须学习这些内容。这就是你进行异步编程的方式。如果你不明白这一点,你就不会走得太远。 但至少告诉我解决这个问题的方法... 您需要“等待”Future 以获取异步工作完成后它将包含的 FirebaseUser 对象。该 FirebaseUser 对象将具有用户 UID 的属性。您可能应该查阅 Flutter 的 Firebase Auth API 文档以了解更多详细信息。 您可能还想在这里阅读以了解 Dart 中的异步编程。没有这些知识,你不会走得太远:dartlang.org/tutorials/language/futures 【参考方案1】:

更新(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() 返回一个未来,你必须等待才能获得这样的用户对象:

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

【讨论】:

谢谢!我的天啊。 Flutter 新手,过时的教程让人很困惑.. @martin 我听到了。 FlutterFire 插件中的重大更改是相对较新的,因此更新过时的文档可能需要一段时间...... 我一直在关注 Angela Yu 的 Flutter 课程。尽管它已经过时了,但我认为它非常好,而且我已经能够找到如何轻松地遵循每个模块,只需在这里和那里进行一些小的调整。但是在模块 15 中,这一步让我非常困惑。将不推荐使用的 Firebase 代码与新代码进行比较,让我找出身份验证问题。谢谢! VS Code 不断向我显示关于invalid_assignment 的错误,为了解决它我不得不在currentUser 之后添加!,如下所示:final User user = auth.currentUser!;【参考方案2】:

如果您使用 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;

【讨论】:

【参考方案3】:

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

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 是同步的。 @DavoudBadamchi 为什么它是同步的?我们不必等待firebase的响应吗? var user = await FirebaseAuth.instance.currentUser! 不正确? ?【参考方案4】:
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'),
            ),

【讨论】:

【参考方案5】:

这是另一种解决方法:

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

它将uid 作为字符串返回

【讨论】:

除非我弄错了,否则它仍然会返回一个 Future,不是吗?即使它是String类型的?你仍然需要在另一端处理它。【参考方案6】:

你也可以试试这个。

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

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

    uid=FirebaseAuthService().currentUser();

【讨论】:

【参考方案7】:

正常做总会有回报

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. 实例 您是否首先创建了 userID 一个全局变量?...您只能通过使用 .then() 来做到这一点【参考方案8】:

您可以在 Flutter 小部件之前将其添加到全局状态中。

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

它将使myUid 可用于这种情况。

【讨论】:

【参考方案9】:

这是一个非常全面的资源,可以使用更新的 Firebase 代码解决与 Flutter 中注册和登录相关的所有问题。 https://kickertech.com/login-and-register-easily-with-flutter-using-firebase/

【讨论】:

【参考方案10】:

更新(Null 安全)

要获取有关用户的 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

【讨论】:

以上是关于如何在 Flutter 中从 Firebase 获取当前用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase获取数据

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

如何在flutter中从firebase实时数据库中获取数据?

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

在 Flutter 中从 Firebase 读取数组 [重复]

在 Flutter 中从 Firebase 检索用户电子邮件