Flutter中Firebase异步函数调用导致result首次返回null问题求助
问题分析与解决
问题根源
你遇到的问题是异步操作未等待导致的:searching()是异步函数,但在addFollowing()里调用时没有加await,代码会直接跳过searching()的执行流程,先运行后续的Firestore写入操作。此时result还未被赋值,自然返回null。第二次点击时,上一次的searching()已执行完成,result已有值,所以能正常工作。
另外还有个细节错误:原代码中result = searchData.docs.first拿到的是整个DocumentSnapshot对象,而doc()方法需要的是文档ID字符串,应改为result = searchData.docs.first.id。
修改后的代码
var result; Future<void> searching() async{ var searchData = await FirebaseFirestore.instance.collection('users').where('email',isEqualTo: userEmail).get(); setState(() { // 修正:获取文档ID而非整个快照对象 result = searchData.docs.first.id; }); } void addFollowing(var username , var email , var phoneNumber) async{ // 关键:等待searching执行完成 await searching(); await FirebaseFirestore.instance.collection('users').doc(result).collection('following').doc().set({ 'username':username, 'email':email, 'phoneNumber':phoneNumber }); print(result); }
更优化的写法(避免全局变量)
全局变量result容易引发状态混乱,建议让searching()直接返回文档ID,不依赖全局变量:
Future<String> searching() async{ var searchData = await FirebaseFirestore.instance.collection('users').where('email',isEqualTo: userEmail).get(); // 直接返回文档ID,无需setState(除非UI需要同步更新) return searchData.docs.first.id; } void addFollowing(var username , var email , var phoneNumber) async{ String userId = await searching(); await FirebaseFirestore.instance.collection('users').doc(userId).collection('following').doc().set({ 'username':username, 'email':email, 'phoneNumber':phoneNumber }); print(userId); }
内容的提问来源于stack exchange,提问作者Aayush Pandey
相关产品推荐
相关产品推荐

