flutter - 如何将 Stream<QuerySnapshot> 转换为 List<myObject>

标签 flutter dart

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

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

  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 会挂起。但是,您希望该函数返回来自 Internet 的内容。这需要时间。该函数必须返回。函数无法简单地执行网络请求并返回结果。欢迎来到 asynchronous programming 的世界.

此外,您拥有的流不是 DocumentSnapshot 的流s(您可以将其转换为 UserTask s),但是 QuerySnapshot 的流s(您可以将其转换为 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
    }
  }


希望能帮助到你。

关于flutter - 如何将 Stream<QuerySnapshot> 转换为 List<myObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152017/

相关文章:

arrays - 如何在不带花括号的情况下打印列表项?

Flutter BLoC 事件竞争条件

flutter - 命名参数未定义

dart - 键盘显示时 Flutter Form 消失

dart - 使用 puppeteer 获取源 html

dart - 如何使用 Dart 分析器从源代码生成 AST 并使用 AST?

android - 无法找到ADB-装有Flutter的Android Studio

flutter - 无法在 flutter 中使用wifi包连接到wifi

flutter - 如何设计自定义ListWheelScrollView像下面的图像在 flutter ?

flutter - Flutter:如何为列表中显示的项目放置GestureDetector