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
相关产品推荐
相关产品推荐

