如何在 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您可以在 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 获取当前用户 ID
如何在flutter中从firebase实时数据库中获取数据?
如何在 Flutter 中从 Firebase Auth 获取用户 ID?