Flutter-Firebase Firestore写入操作失败问题排查求助
Firebase Auth成功但Firestore文档未创建的排查与解决
问题场景
Firebase Auth已成功创建用户(可打印出有效UID),但后续Firestore的set操作未生成对应文档,代码如下:
FirebaseAuth _auth = FirebaseAuth.instance; FirebaseFirestore _firestore = FirebaseFirestore.instance; //... final userCredential = await _auth.createUserWithEmailAndPassword( email: _emailController.text, password: _passwordController.text, ); print(userCredential.user?.uid); // mdaAcc1rXTe1s7VeWR7zcu6t4XD2 _firestore.collection("Users").doc(userCredential.user?.uid).set({ "ID": userCredential.user?.uid, "Email": _emailController.text, "Phone": _phoneController.text, "Name": _nameController.text, "Surname": _surnameController.text, "Photo": "https://firebasestorage.googleapis.com/v0/b/teen-software-stock-tracking.appspot.com/o/default.jpg?alt=media&token=0eec2e1f-2ccf-4bda-8664-3d3f018621b3", "Level": 0, "ProductRight": 10, "AddedProduct": 0, "AccountCreate": FullDate.toString(), });
1. 未捕获Firestore操作异常
代码中未对set操作添加await,也没有异常捕获逻辑。如果Firestore操作因权限、字段格式等问题失败,程序不会抛出错误,你无法得知具体问题。
解决:
给set操作加上await,并用try-catch包裹排查错误:
try { await _firestore.collection("Users").doc(userCredential.user?.uid).set({ // 保留原有字段内容 "ID": userCredential.user?.uid, "Email": _emailController.text, "Phone": _phoneController.text, "Name": _nameController.text, "Surname": _surnameController.text, "Photo": "https://firebasestorage.googleapis.com/v0/b/teen-software-stock-tracking.appspot.com/o/default.jpg?alt=media&token=0eec2e1f-2ccf-4bda-8664-3d3f018621b3", "Level": 0, "ProductRight": 10, "AddedProduct": 0, "AccountCreate": FullDate.toString(), }); print("Firestore文档写入成功"); } catch (e) { print("Firestore写入失败: $e"); }
2. Firestore安全规则限制
默认的Firestore安全规则禁止所有读写操作,即使Auth成功,未配置正确规则也无法写入。
解决:
修改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; } } }
3. UID为空的潜在风险
尽管打印出了UID,但极端情况下userCredential.user可能变为null,导致doc(null)操作无意义。
解决:
提前校验UID有效性:
final uid = userCredential.user?.uid; if (uid == null) { print("用户UID为空,无法写入Firestore"); return; } // 用已校验的uid执行写入 await _firestore.collection("Users").doc(uid).set({ "ID": uid, // 其他字段内容 });
4. FullDate变量异常
如果FullDate未正确初始化或类型错误,调用toString()会导致写入失败。
解决:
替换为明确的日期生成逻辑:
"AccountCreate": DateTime.now().toString(),
5. 集合名称大小写不匹配
Firestore集合名称区分大小写,若代码中写的是"Users",而控制台中实际集合是"users",会导致文档写入到你未关注的集合中。
解决:
确保代码中的集合名称与Firebase控制台显示的完全一致,包括大小写。
内容的提问来源于stack exchange,提问作者Emir Bolat
相关产品推荐
相关产品推荐

