【发布时间】: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<int> foo() async* { await Future.delayed(6.seconds); yield* Stream.periodic(1.seconds, (i) => 10 * i).take(3); } Stream<int> foo2() { StreamCompleter completer = StreamCompleter<int>(); Future.delayed(6.seconds).then((value) => completer.setSourceStream( Stream.periodic(1.seconds, (i) => 10 * i).take(3) )); return completer.stream; }- 在这里你可以使用async* / await或StreamCompleter / then- 我认为第一个版本更容易......跨度> -
btw 在第二个版本中你也可以使用
StreamController(而不是StreamCompleter) -
非常感谢!工作正常!
标签: firebase flutter stream future