You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:56:13