使用Firestore监听函数时是否必须使用async/await?
问题解答
核心结论
不需要使用await,直接通过String myFirstValue = event.get('name');获取字段值是更优的写法,后续依赖该值的操作也不会出现错误。
具体原因
DocumentSnapshot 已完全加载:当
snapshots()的监听回调触发时,传入的event是一个已经完成数据加载的DocumentSnapshot对象——Firestore只会在文档的所有字段数据都获取完成(不管是从服务器拉取还是读取本地缓存)后,才会向流中推送这个快照。因此event.get('name')是一个同步操作,直接返回内存中已存在的字段值,根本不需要异步等待。为什么加await也能运行?
Dart的async函数允许await任何类型的值:如果值不是Future,Dart会自动将其包装成一个立即完成的Future,所以代码不会报错,但这完全是多余的操作,会额外增加异步调度的开销,没有任何实际意义。
代码优化建议
把多余的await去掉,简化后的代码如下:
FirebaseFirestore.instance.collection('users').doc(widget.userId).snapshots().listen((event) { if (!event.metadata.isFromCache) { String myFirstValue = event.get('name'); // 依赖myFirstValue的本地操作 } });
内容的提问来源于stack exchange,提问作者Mohammed Hamdan
相关产品推荐
相关产品推荐

