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

Flutter接入Firebase实现登录时无法获取已登录用户用户名如何解决

问题原因

你代码中一共存在两个核心错误,导致无法正常获取用户名:

1. 数据库查询字段匹配错误

查看DatabaseMethods.dart中的getUserByUserEmail方法,你错误地将查询条件设置为匹配name字段,等于用用户输入的邮箱去比对用户名,自然查询不到结果:

// 错误代码
getUserByUserEmail(String userEmail) async {
  return await FirebaseFirestore.instance.collection("users")
      .where("name", isEqualTo: userEmail).get();
}

将查询字段修改为你存储邮箱对应的字段即可(如果你注册时存邮箱的字段不是email,替换为你实际的字段名):

// 修正后代码
getUserByUserEmail(String userEmail) async {
  return await FirebaseFirestore.instance.collection("users")
      .where("email", isEqualTo: userEmail).get();
}

2. 异步逻辑无等待,执行顺序混乱

你在SignIn.dart的signIn方法中,查询用户信息和登录操作是并行执行的两个异步任务,没有添加等待逻辑,经常会出现还没拿到用户信息、没把用户名存入SharedPreferences,就已经跳转到聊天室页面的情况,自然获取不到用户名。
修正后的signIn方法需要添加await保证执行顺序:

signIn() async {
  if (formKey.currentState!.validate()) {
    HelperFunctions.saveUserEmailSharedPreference(emailTextEditingController.text);
    setState(() {
      isLoading = true;
    });
    // 等待查询用户信息完成
    final val = await databaseMethods.getUserByUserEmail(emailTextEditingController.text);
    snapShotUserInfo = val;
    if(snapShotUserInfo?.docs.isNotEmpty == true) {
      HelperFunctions.saveUserNameSharedPreference(snapShotUserInfo?.docs[0].data()["name"]);
      print("${snapShotUserInfo?.docs[0].data()["name"]} is my name");
    }
    // 完成后再执行登录
    final loginResult = await authMethods.signInWithEmailAndPassword(emailTextEditingController.text, passwordTextEditingController.text);
    if (loginResult != null) {
      HelperFunctions.saveUserLoggedInSharedPreference(true);
      if(mounted) {
        Navigator.pushReplacement(context,
            MaterialPageRoute(
                builder: (context) => ChatRoom())
        );
      }
    } else {
      setState(() {
        isLoading = false;
      });
    }
  }
}

内容的提问来源于stack exchange,提问作者VenoM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:45:02