【问题标题】:How to get the current user id from Firebase in Flutter如何在 Flutter 中从 Firebase 获取当前用户 ID
【发布时间】: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

标签: firebase dart firebase-authentication flutter


【解决方案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
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-24
              • 2021-07-16
              • 2021-11-23
              • 2021-11-12
              • 2021-03-05
              • 1970-01-01
              • 1970-01-01
              • 2020-10-15
              相关资源
              最近更新 更多