【问题标题】:Stream gets returned before Future finishes在 Future 完成之前返回 Stream
【发布时间】:2021-05-22 16:42:21
【问题描述】:

使用此功能,我从 firestore 加载所有新闻。我使用 test-List 进行查询。

Stream<List<News>> getAllNews(List<String> test) {
    return _db
        .collection('news')
        .where('userRoleList', arrayContainsAny: test)
        .orderBy('createdAt', descending: true)
        .snapshots() // oder .get um ein Future zu bekommen
        .map((query) => query.docs)
        .map((snapshot) =>
            snapshot.map((doc) => News.fromJson(doc.data())).toList());
  }

通过这个函数,我将 List 传递给前一个函数。但问题是,Stream 在 Future 完成之前被返回。

Stream<List<News>> getAllTheNews() {
    getUser(_auth.currentUser.uid)
        .then((value) => userRoles = value.userRoleList);

    return _firestoreNewsService.getAllNews(userRoles);
  }

是否有任何解决方案,例如在延迟后返回 Stream 或其他什么?

谢谢你

【问题讨论】:

  • 使用await并删除.then
  • 但是我需要一个异步函数,这不适用于 Stream
  • 没错,但是async* - 查看两个版本:Stream&lt;int&gt; foo() async* { await Future.delayed(6.seconds); yield* Stream.periodic(1.seconds, (i) =&gt; 10 * i).take(3); } Stream&lt;int&gt; foo2() { StreamCompleter completer = StreamCompleter&lt;int&gt;(); Future.delayed(6.seconds).then((value) =&gt; completer.setSourceStream( Stream.periodic(1.seconds, (i) =&gt; 10 * i).take(3) )); return completer.stream; } - 在这里你可以使用async* / awaitStreamCompleter / then - 我认为第一个版本更容易......跨度>
  • btw 在第二个版本中你也可以使用StreamController(而不是StreamCompleter
  • 非常感谢!工作正常!

标签: firebase flutter stream future


【解决方案1】:

您可以使用 async 和 await。

Stream<List<News>> getAllTheNews() async {
  final user = await getUser(_auth.currentUser.uid);
  final userRoles = user.userRoleList;

  return _firestoreNewsService.getAllNews(userRoles);
}

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多