无法将Future<String>函数输出赋值给String变量的问题排查
问题解决:Firestore getName函数返回空字符串的原因与修复方案
问题根源
你当前的getName函数中,forEach回调里的return只是终止当前回调函数的执行,并不会将值作为整个getName函数的返回结果。遍历结束后,函数会继续执行到最后的return "",所以最终返回空字符串。
修复方案
方案1:用for循环替代forEach
将forEach改为普通的for循环,这样return语句会直接返回整个getName函数的结果:
Future<String> getName(userID) async { CollectionReference collectionReference = FirebaseFirestore.instance.collection("Users"); QuerySnapshot querySnapshot = await collectionReference.get(); // 替换forEach为for循环 for (var doc in querySnapshot.docs) { if (doc.get("ID") == userID) { final userName = doc.get("Name"); print("returning $userName"); return userName; } } return ""; }
方案2:优化Firestore查询(更高效)
没必要全量获取Users集合的所有文档再遍历,直接用where条件查询匹配的文档,性能更好:
Future<String> getName(userID) async { CollectionReference collectionReference = FirebaseFirestore.instance.collection("Users"); // 直接添加where条件过滤 QuerySnapshot querySnapshot = await collectionReference .where("ID", isEqualTo: userID) .get(); // 判断是否有匹配的文档 if (querySnapshot.docs.isNotEmpty) { final userName = querySnapshot.docs.first.get("Name"); print("returning $userName"); return userName; } return ""; }
关于赋值方式的补充说明
- await方式:修复
getName函数后,你的await代码就能正常获取到正确的userName值,无需额外修改。 - then方式:原代码中
print(userName)在then回调执行前就运行了,所以输出空字符串。需要把print放到回调内部:
String userName = ""; getName(FirebaseAuth.instance.currentUser!.uid).then((value) { userName = value; print(userName); // 此时才是赋值后的正确值 });
内容的提问来源于stack exchange,提问作者Maurice Medhat
相关产品推荐
相关产品推荐

