当前位置: 首页 > 面试题库 >

如何转换流 列出

仲元凯
2023-03-14
问题内容

我正在查询Firestore,并将流作为QuerySnapshots流返回。我需要将流中包含的文档映射到对象列表。

下面的代码不起作用(很明显)……也许我只是在看这个完全错误的代码。

  List<UserTask> getUserTaskList() {
    List<UserTask> list;

    Stream<QuerySnapshot> stream = 
      Firestore.instance.collection('userTasks').snapshots();
    stream.listen((snapshot) {
      snapshot.documents.forEach((doc) {
        UserTask userTask = UserTask(
            doc.data['id'],
            doc.data['Description'],
            etc...);

        list.add(userTask);
      });
    });

    return list;
  }

使用上面的代码,由于它不等待整个流(或实际上不等待任何流),因此list始终以null返回。简而言之,如何将我的视频流转换为列表?

注意:我对Dart领域还很陌生,所以请放轻松:)

谢谢!


问题答案:

首先,考虑一下:此函数必须很快返回。所有功能都可以,否则UI会挂起。但是,您期望函数返回来自互联网的内容。这需要时间。该函数必须返回。函数无法简单地进行网络请求并返回结果。欢迎来到异步编程的世界。

此外,您拥有的流不是DocumentSnapshots 流(可以转换为UserTasks),而是QuerySnapshots
流(可以转换为List<UserTask>s)。注意那里的复数。如果您只想UserTask一次获得所有s,则应使用Future而不是Stream。如果您想UserTask在每次更改后重复获得所有s,那么使用一个Stream有意义的方法。

既然您说过要获取List<UserTask>,我假设您只想获取的集合UserTask一次。

因此,您的代码将变成这样:

  Future<List<UserTask>> getUserTaskList() async {

    QuerySnapshot qShot = 
      await Firestore.instance.collection('userTasks').getDocuments();

    return qShot.documents.map(
      (doc) => UserTask(
            doc.data['id'],
            doc.data['Description'],
            etc...)
    ).toList();
  }

  main() async {
    List<UserTask> tasks = await getUserTaskList();
    useTasklist(tasks); // yay, the list is here
  }

现在,如果您真的想使用流,请按以下步骤操作:

  Stream<List<UserTask>> getUserTaskLists() async {

    Stream<QuerySnapshot> stream = 
      Firestore.instance.collection('userTasks').snapshots();

    return stream.map(
      (qShot) => qShot.documents.map(
        (doc) => UserTask(
            doc.data['id'],
            doc.data['Description'],
            etc...)
      ).toList()
    );
  }

  main() async {
    await for (List<UserTask> tasks in getUserTaskLists()) {
      useTasklist(tasks); // yay, the NEXT list is here
    }
  }

希望能帮助到你。



 类似资料:
  • 我刚刚补充道 对这个项目。我有<code>suspend fun foo():Flow 我需要获得

  • 问题内容: 我想在流之前添加一个Optional。由于只能隐藏流,所以我有以下问题: 如何将Optional 转换为Stream ? 例: 问题答案: 在Java-9中,添加了缺少的方法,因此此代码有效: 参见JDK-8050820。在此处下载Java-9 。

  • 我想用可选的。由于只能连接流,我有以下问题: 如何将可选 转换为流 ? 示例:

  • 我有一个lambda表达式,我想在其中创建一个对象列表,但我得到了错误 错误 我希望作为lambda表达式的返回类型。我怎样才能做到呢?

  • 问题内容: 我需要将a转换为数组;谁能告诉我它是如何完成的? 问题答案: 应当注意,两个数组的顺序可能不相同,请参见oxbow_lakes答案,以获得在需要键/值对时更好的迭代方法。

  • 我想用Java8Stream API将一个Java POJO列表转换为一个非静态方法中的映射。 我的折线图需要x轴的日期字符串值列表和Y轴的数值列表。这是一种典型的地图格式。但我的数据库为我返回了一个POJO列表。我不喜欢在没有Java8流API的帮助下进行循环。我尝试了这个[ask}(Java 8 List of Objects to map of values)中的方法。但是,我面临两个问题。

  • 问题内容: //或将多部分文件保存到数据库的任何其他解决方案。我尝试用这种方式,但出现错误。 问题答案:

  • 问题内容: 我有一个第三方图书馆给我一个图书馆。我想像Java 8那样懒惰地使用该枚举,并调用诸如此类的东西。 有没有现成的图书馆?我已经在引用Guava和Apache Commons,所以如果其中任何一个都有理想的解决方案。 另外,在保留所有内容的懒惰性质的同时将a 变成最佳/最简单的方法是什么? 问题答案: 这个答案已经提供了一个解决方案,可以解决以下问题: 应当强调的是,由此而来 的 懒任何