创建帐户后尝试获取用户 uid 但为空
trying to get user uid after creating account but getting null
我试图在创建帐户后获取用户 uid,因此我可以在 firestore 上创建一个文档,并将 uid 作为文档 id。问题是我只得到空值。这是我正在使用的功能:
void setUserDoc(name, lastName, email) {
FirebaseAuth auth = FirebaseAuth.instance;
String? uid = auth.currentUser?.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
return;
}
这是小部件的一部分:
Padding(
padding: const EdgeInsets.only(top: 50, right: 50, left: 50),
child: ElevatedButton(
onPressed: () {
setState(() {
_passwordError = validatePassword(passwordController.text);
_emailError = validateEmail(emailController.text);
});
if (_passwordError == null && _emailError == null) {
authService.createUserWithEmailAndPassword(
emailController.text,
passwordController.text,
);
setUserDoc(
nameController.text,
lastNameController.text,
emailController.text,
);
Navigator.of(context).pushNamed('/');
}
},
我错过了什么?
看起来您在 auth.currentUser
初始化之前访问它,然后没有处理它返回的 null
。
由于应用程序启动时恢复身份验证状态需要时间,因此您应该listen to the auth state。这样,您的代码将是:
FirebaseAuth.instance
.authStateChanges()
.listen((User? user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
String? uid = user.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
}
});
我认为与其创建 FirebaseAuth
auth
的实例,不如从中获取 uid
。
相反,您需要创建 User
的实例(之前的 FirebaseUser
),然后从中获取 uid
。
试试这个。
late User user;
String? uid;
void setUserDoc(name, lastName, email) {
user= FirebaseAuth.instance.currentUser!;
uid = user.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
return;
}
我试图在创建帐户后获取用户 uid,因此我可以在 firestore 上创建一个文档,并将 uid 作为文档 id。问题是我只得到空值。这是我正在使用的功能:
void setUserDoc(name, lastName, email) {
FirebaseAuth auth = FirebaseAuth.instance;
String? uid = auth.currentUser?.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
return;
}
这是小部件的一部分:
Padding(
padding: const EdgeInsets.only(top: 50, right: 50, left: 50),
child: ElevatedButton(
onPressed: () {
setState(() {
_passwordError = validatePassword(passwordController.text);
_emailError = validateEmail(emailController.text);
});
if (_passwordError == null && _emailError == null) {
authService.createUserWithEmailAndPassword(
emailController.text,
passwordController.text,
);
setUserDoc(
nameController.text,
lastNameController.text,
emailController.text,
);
Navigator.of(context).pushNamed('/');
}
},
我错过了什么?
看起来您在 auth.currentUser
初始化之前访问它,然后没有处理它返回的 null
。
由于应用程序启动时恢复身份验证状态需要时间,因此您应该listen to the auth state。这样,您的代码将是:
FirebaseAuth.instance
.authStateChanges()
.listen((User? user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
String? uid = user.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
}
});
我认为与其创建 FirebaseAuth
auth
的实例,不如从中获取 uid
。
相反,您需要创建 User
的实例(之前的 FirebaseUser
),然后从中获取 uid
。
试试这个。
late User user;
String? uid;
void setUserDoc(name, lastName, email) {
user= FirebaseAuth.instance.currentUser!;
uid = user.uid;
DocumentReference<Map<String, dynamic>> usersRef =
FirebaseFirestore.instance.collection('users').doc(uid);
usersRef.set({
'name': name,
'lastName': lastName,
'email': email,
'createdAt': FieldValue.serverTimestamp(),
});
return;
}