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

Flutter Firestore异步代码问题:如何让外部myData先更新再打印?

问题分析与解决方案

这问题核心是异步操作的执行顺序搞的鬼~

为什么会出现当前的输出顺序?

你的getData()是带async关键字的异步函数,当在checkMyData()里调用它时,程序不会等待它内部的Firestore请求完成,而是直接继续执行后面的print('outside $myData')。这时候myData还停留在你设置的5,所以先输出flutter: outside 5;等Firestore的异步请求完成后,getData()才会更新myData为179并打印内部的日志。

修改方案

要让外部的print等待myData更新完成,只需要把checkMyData()也改成异步函数,并用await等待getData()执行完毕:

class Test {
  Firestore _firestore = Firestore.instance;
  var myData;
  void getData() async {
    DocumentSnapshot snapshot = await _firestore.collection('Counter').document('Counter').get();
    myData = snapshot.data['Counter']; // 这里无需额外await,snapshot.data是同步数据
    print('inside $myData');
  }
  // 将checkMyData改为异步函数,返回Future<void>
  Future<void> checkMyData() async {
    myData = 5;
    await getData(); // 等待getData的异步操作全部完成
    print('outside $myData');
  }
}

关键修改点说明

  • 给checkMyData()添加async关键字,使其成为异步函数,返回Future<void>(因为没有需要返回的业务数据)
  • 在调用getData()时加上await,强制程序暂停在这里,直到getData()内部的Firestore请求完成、myData更新完毕后,再执行后续的print语句

另外补充个小细节:getData()里的myData = await snapshot.data['Counter'];其实不需要await,因为snapshot.data是同步获取的Document数据,直接赋值即可,去掉await不会影响功能。

内容的提问来源于stack exchange,提问作者Izac Tan Ping Ping

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:55