【问题标题】:trying to get user uid after creating account but getting null创建帐户后尝试获取用户 uid 但为空
【发布时间】:2022-01-16 10:35:18
【问题描述】:

我试图在创建帐户后获取用户 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('/');
  }
},

我错过了什么?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore firebase-authentication


    【解决方案1】:

    看起来您在初始化之前访问了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(),
          });
        }
      });
    

    【讨论】:

    • 有效!非常感谢,我没有想到。我以为在创建新用户后我已经有了 uid。再次感谢!
    【解决方案2】:

    我认为与其创建FirebaseAuthauth 的实例,不如尝试从中获取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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多