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

