创建帐户后尝试获取用户 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;
}