我正在查询FiRestore,并以QuerySnapshot流的形式返回一个流.我需要将流中包含的文档映射到对象列表.

下面的代码(显然)不起作用……也许我完全看错了.

  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秒的流(可以转换为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
    }
  }

希望有帮助.

Dart相关问答推荐

构造函数:将预处理的参数存储在传递给最终字段的辅助变量中

切换到可靠的零安全后简单分配中的可空性不匹配

Flutter中TextFieldForm中的字母间距

无法在Flutter中为 TabBarView 设置动态高度

什么用例有 FirebaseUser 的 reload() 功能?

Flutter - 为什么滑块不会在 AlertDialog 中更新?

Flutter 从asset文件夹中读取所有文件

Flutter Text 小部件中的 StrutStyle 是什么

如何在Dart中switch 枚举?

如何在Flutter 的http.MultipartRequest请求上上传文件时获取进度事件

你如何在 Dart 中将月份的日期格式化为11th、21st或23rd?

为什么 Angular 在组件名称中不需要破折号

如何在dart中获得一周的开始或结束

如何使用 Dart 和 web 以 60fps 的速度驱动动画循环?

以编程方式使dart中的十六进制 colored颜色 变亮或变暗

是否有任何官方计划在 Google App Engine 上支持 Dart?

在 Dart 中是否允许在 for 循环中等待?

从函数返回多个值

在 Dart 中,bool是否有parse,就像int一样?

你需要在 Dart 中使用new关键字吗?