Flutter Firebase聊天应用:如何根据邮箱查询Firestore获取用户名
问题分析与解决方案
核心问题
你在注册时仅向userNames集合存入了name字段,未关联用户的邮箱地址,导致后续通过email查询用户名时找不到匹配文档,无法获取到正确的用户名。
步骤1:修复注册时的存储逻辑
修改注册代码,将用户邮箱与用户名一同存入userNames集合,建立邮箱和用户名的关联:
final newUser = await _auth.createUserWithEmailAndPassword(email: email, password: password); // 同时存入邮箱和用户名 await _firestore.instance.collection('userNames').add({ 'name': userName, 'email': email // 新增邮箱字段用于关联查询 }); if (newUser != null && password.length >= 6) { Navigator.pushReplacementNamed(context, 'chat'); }
步骤2:优化消息发送时的查询逻辑
在获取用户名时,增加查询结果为空的异常处理,避免程序崩溃:
final currentUser = FirebaseAuth.instance.currentUser!; final userNamesSnapshot = await _firestore.instance .collection('userNames') .where('email', isEqualTo: currentUser.email) .get(); if (userNamesSnapshot.docs.isNotEmpty) { final userName = userNamesSnapshot.docs.first.get('name'); await _fireStore.collection('messages').add({ 'Text': messageText, 'Sender': userName, 'Time': DateTime.now(), }); } else { // 未找到用户名时的降级处理,比如取邮箱前缀作为默认名称 await _fireStore.collection('messages').add({ 'Text': messageText, 'Sender': currentUser.email!.split('@')[0], 'Time': DateTime.now(), }); }
可选优化方案:将用户名存入Firebase Auth用户信息
为减少Firestore查询次数,可在注册时直接把用户名存入Firebase Auth的用户自定义属性,后续直接从Auth中读取:
注册时更新Auth用户信息
final newUser = await _auth.createUserWithEmailAndPassword(email: email, password: password); if (newUser != null) { // 更新Auth用户的显示名称 await newUser.user!.updateDisplayName(userName); // 可选:同时存入Firestore做数据备份 await _firestore.instance.collection('userNames').add({ 'name': userName, 'email': email, 'uid': newUser.user!.uid }); if (password.length >= 6) { Navigator.pushReplacementNamed(context, 'chat'); } }
发送消息时直接获取用户名
final currentUser = FirebaseAuth.instance.currentUser!; // 优先用Auth中的显示名称,无则取邮箱前缀 final userName = currentUser.displayName ?? currentUser.email!.split('@')[0]; await _fireStore.collection('messages').add({ 'Text': messageText, 'Sender': userName, 'Time': DateTime.now(), });
内容的提问来源于stack exchange,提问作者Ahmad Ali
相关产品推荐
相关产品推荐

