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

此外,您拥有的流不是DocumentSnapshot的流(可以将其转换为UserTask),而是QuerySnapshot的流(可以将其转换为List<UserTask>)。注意那里的复数。如果您只想一次获取所有UserTask,则应使用Future而不是Stream。如果您想在每次更改后重复获取所有UserTask,那么使用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/

10-11 19:17