如何在返回Stream<QuerySnapshot>前等待getUserSortMethod的结果?
问题:等待异步结果后返回Firestore查询流
用户提供的原始代码:
Stream<QuerySnapshot> getAllLists() { late String temp = "name"; getUserSortMethod().then((value) => { temp = value.toString(), // temp is now "prio" }); return firestore .collection('lists') .where('editors', arrayContains: currentUser.email) .orderBy(temp, descending: false) .snapshots(); }
需求说明:需要等待getUserSortMethod()的返回结果,再将其用于后续的Firestore查询逻辑中。曾尝试将主函数改为异步并返回Future<Stream<QuerySnapshot<Object?>>>,但未能成功。
解决方案
原来的写法存在异步时序问题:getUserSortMethod()是异步操作,then回调里的赋值会在函数返回之后才执行,所以返回的查询用的始终是初始值"name",根本没等到排序方法的结果。
改成异步函数是正确的方向,以下是正确的实现:
Future<Stream<QuerySnapshot>> getAllLists() async { // 等待getUserSortMethod的结果,直接赋值给temp String temp = (await getUserSortMethod()).toString(); return firestore .collection('lists') .where('editors', arrayContains: currentUser.email) .orderBy(temp, descending: false) .snapshots(); }
关键说明:
- 给函数添加
async关键字,返回类型改为Future<Stream<QuerySnapshot>>——因为需要先异步获取排序字段,才能返回最终的查询流 - 使用
await关键字等待getUserSortMethod()的结果,确保后续的Firestore查询使用的是最新的排序字段 - 调用该函数时,需要处理外层的
Future,示例:// 方式1:用then处理 getAllLists().then((listsStream) { listsStream.listen((snapshot) { // 处理查询快照数据 }); }); // 方式2:在异步函数中用await Stream<QuerySnapshot> listsStream = await getAllLists(); listsStream.listen((snapshot) { // 处理查询快照数据 });
内容的提问来源于stack exchange,提问作者avantgarde
相关产品推荐
相关产品推荐

