如何在Flatter中从Firebase获取当前用户id
我正在尝试这个-如何在Flatter中从Firebase获取当前用户id,firebase,dart,firebase-authentication,flutter,Firebase,Dart,Firebase Authentication,Flutter,我正在尝试这个- final Future<FirebaseUser> user = auth.currentUser(); final Future user=auth.currentUser(); 但问题是,不是通过“用户ID”生成文档,而是通过以下名称生成文档: Instance of 'Future<FirebaseUser>' “未来”的实例 这是我现在的文档名,但我想让它成为用户ID 我该怎么办?更新(2020.09.09) firebase_认证版本
final Future<FirebaseUser> user = auth.currentUser();
final Future user=auth.currentUser();
但问题是,不是通过“用户ID”生成文档,而是通过以下名称生成文档:
Instance of 'Future<FirebaseUser>'
“未来”的实例
这是我现在的文档名,但我想让它成为用户ID
我该怎么办?更新(2020.09.09)
firebase_认证版本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
}
final FirebaseAuth auth = FirebaseAuth.instance;
void inputData() async {
final FirebaseUser user = await auth.currentUser();
final uid = user.uid;
// here you write the codes to input the data into firestore
}
firebase_认证版本0.18.0之前
uid是FirebaseUser对象的属性。由于auth.currentUser()返回一个future,因此必须等待以获得如下所示的用户对象:
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
}
final FirebaseAuth auth = FirebaseAuth.instance;
void inputData() async {
final FirebaseUser user = await auth.currentUser();
final uid = user.uid;
// here you write the codes to input the data into firestore
}
如果您使用谷歌登录,您将获得此用户信息
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;
}
final FirebaseAuth FirebaseAuth=FirebaseAuth.instance;
最终GoogleSignIn_GoogleSignIn=新GoogleSignIn();
void initState(){
super.initState();
firebaseAuth.onAuthStateChanged
.firstWhere((用户)=>user!=null)
.然后((用户){
字符串user\u Name=user.displayName;
字符串image_Url=user.photoUrl;
字符串email_Id=user.email;
字符串user\u Uuid=user.uid;//等
}
//给导航动画等一些时间来完成
新的未来。延迟(新的持续时间(秒:2))
。然后(()=>使用谷歌()登录);
}
未来登录使用Google()异步{
//尝试获取当前经过身份验证的用户
GoogleSignInAccount currentUser=\u googleSignIn.currentUser;
if(currentUser==null){
//尝试在没有用户交互的情况下登录
currentUser=Wait_googleSignIn.signizely();
}
if(currentUser==null){
//强制用户以交互方式登录
currentUser=Wait_googleSignIn.signIn();
}
最终谷歌签名认证=
等待currentUser.authentication;
//通过firebase验证
final FirebaseUser user=等待firebaseAuth.signiWithGoogle(
idToken:googleAuth.idToken,
accessToken:googleAuth.accessToken,
);
断言(用户!=null);
断言(!user.isAnonymous);
返回用户;
}
您需要等待异步操作完成
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
});
这是另一种解决方法:
Future<String> inputData() async {
final FirebaseUser user = await FirebaseAuth.instance.currentUser();
final String uid = user.uid.toString();
return uid;
}
Future inputData()异步{
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
最后一个字符串uid=user.uid.toString();
返回uid;
}
它以字符串形式返回uid
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'),
),
正常地做这件事总会有回报
Instance of 'Future<FirebaseUser>'
这是获取ID最方便的方法
你也可以像这样获得电子邮件和手机号码。你也可以试试这个
currentUser() {
final User user = _firebaseAuth.currentUser;
final uid = user.uid.toString();
return uid;
}
现在只需在代码中调用currentUser()
,它将返回当前登录用户的uid
uid=FirebaseAuthService().currentUser();
您可以在颤振小部件之前将其添加到全局状态
final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final myUid = user.uid;
它将使myUid在这种情况下可用。你知道你应该如何在dart中使用Futures吗?好的,如果你想用Flatter编写应用程序,这是你必须学习的。这是你如何进行异步编程。如果你不懂,你不会走得很远。但至少告诉我此问题的解决方案…您需要“等待”将来在异步工作完成时获得它将包含的FirebaseUser对象。该FirebaseUser对象将具有用户UID的属性。您可能应该查阅Firebase Auth API文档了解更多详细信息。您可能还需要阅读此处了解rn关于Dart中的异步编程。没有这些知识,你不会走得很远:除非我弄错了,否则它仍然会返回一个未来,不是吗?即使它是字符串类型的?你仍然需要在另一端处理它。这不起作用。我只是用我的代码尝试了它,它给出了相同的未来实例。你是第一次创建u吗serID a全局变量?…您只能通过使用.then()来实现这一点。谢谢!天哪!Flatter是新手,而且过时的教程太混乱了。@martin我听到了。FlatterFire插件中的突破性更改相对较新,因此更新过时的文档可能需要一段时间……获取Firebase currentUser是同步的。