Firebase注册报错firebase_auth/unknown: null 如何存储用户额外信息
报错排查
你遇到的firebase_auth/unknown: null错误由两个代码问题共同导致:
- 邮箱输入框未绑定值的监听回调
你代码里的邮箱TextFormField只有校验逻辑,没有添加onChanged回调把输入的内容赋值给你声明的email变量,调用注册接口时传的邮箱参数是null,直接触发未知错误。修复方法如下:
TextFormField( validator: (value) { if (value == null || value.isEmpty) { return '*Email Address Required'; } return null; }, // 新增下面这行赋值逻辑 onChanged: (value) { email = value; }, ),
- 注册逻辑未放到表单校验判断内
当前你的注册try/catch代码块写在了if (_formKey.currentState.validate())判断外面,就算表单校验不通过也会触发注册逻辑,传空参数必然报错。需要把整个注册逻辑移到校验判断的代码块内,同时记得把加载状态关闭的逻辑也放到异常捕获里,避免报错后加载动画一直显示:
onPressed: () async { if (_formKey.currentState.validate()) { setState(() { showSpinner = true; }); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Processing Data')), ); try { final newUser = await _auth.createUserWithEmailAndPassword( email: email, password: password); if(newUser!=null){ Navigator.pushNamed(context, MainEmployeeScreen.id); print(name); } setState(() { showSpinner = false; }); } catch(e){ print(e); setState(() { showSpinner = false; }); } } }
存储自定义用户信息方法
Firebase Auth仅存储邮箱、密码哈希、用户uid这类核心账号凭证,年龄、性别这类自定义字段需要搭配Firebase Cloud Firestore存储,操作步骤如下:
- 先在Firebase控制台开通Cloud Firestore,配置安全规则,保证用户仅能读写自己的用户数据:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
- 注册成功拿到用户uid后,往
users集合中写入对应用户的自定义字段:
if(newUser!=null){ // 写入自定义用户信息 await FirebaseFirestore.instance.collection('users').doc(newUser.user.uid).set({ 'name': name, 'age': 你收集到的年龄变量, 'gender': 你收集到的性别变量, 'email': email, 'createTime': FieldValue.serverTimestamp(), }); Navigator.pushNamed(context, MainEmployeeScreen.id); }
- 后续用户登录后,直接用当前登录用户的uid查询
users集合下的对应文档,就能拿到所有自定义信息。
内容的提问来源于stack exchange,提问作者Usama Bin Tahir
相关产品推荐
相关产品推荐

