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

如何在返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:46:17