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

oipij1gg  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(105)

我正在查询Firestore,并以QuerySnapshots流的形式返回一个流。我需要将流中包含的文档Map到对象列表。
下面的代码不工作(显然)......也许我只是看这个完全错误。

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。简而言之,如何将流转换为List?
注:我对Dart的世界很陌生,所以对我宽容点:)
谢谢你,谢谢

hmae6n7t

hmae6n7t1#

首先,请想一想:该函数必须非常快地返回。所有函数都执行,否则UI将挂起。但是,您希望该函数返回来自Internet的内容。这需要时间。函数必须返回。函数不可能简单地执行网络请求并返回结果。欢迎来到asynchronous programming的世界。
此外,您拥有的流不是DocumentSnapshot s的流(可以将其转换为UserTask s),而是QuerySnapshot s的流(可以将其转换为List<UserTask> s)。注意这里的复数。如果您只想一次性获得所有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
    }
  }


希望对你有帮助。

0s7z1bwu

0s7z1bwu2#

1.就像这样

Future<Stream<List<UserTask>>>
      get getUserTaskLists async {
    var str = FirebaseFirestore.instance
        .collection('userTasks')
        .snapshots();

    return str.map((snapshot) => snapshot.docs
        .map((doc) =>
            UserTask.fromJson(doc.data())

// or UserTask(
//             doc.data['id'],
//            doc.data['Description'],
//            etc...)

         ) .toList());
  }

字符串
所以,我使用了一个getter,但它可能是一个函数(方法)Future<Stream> getUserTaskLists();

相关问题