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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:00:56