试图找出为什么这不能按我所期望的顺序执行。我希望2是最后一个执行,但它是完成之前,所有其他运行。无法理解为什么在4点之后,在听流之前返回函数。
Future mainFn() async {
print('Listen 1');
Ob o = await listenFn();
print('Listen 2');
return await someFn(o);
}
Future<Ob> listenFn() async {
o = new Ob();
print('Listen 3');
Stream<Ct> stream = await getCt();
print('Listen 4');
stream.listen((Ct _ct) {
print('Listen 7');
if (!cts.contains(_ct)) {
setState(() {
cts.add(_ct);
});
}
}, onError: (a) {
print('Listen 8');
print(a);
}, onDone: () async {
print('Listen 9');
o = await addOb(cts); <-- This function returns Future<Ob>
});
await stream.drain();
print('Listen 14');
return o;
}
Future<Stream<Ct>> getCt() async {
print('Listen 5');
final String url = 'API_URL';
final client = new http.Client();
final request = http.Request('get', Uri.parse(url));
final streamedRest = await client.send(request);
print('Listen 6');
return streamedRest.stream
.transform(utf8.decoder)
.transform(json.decoder)
.map((data) => Helper.getData(data))
.expand((data) => (data as List))
.map((data) {
return Ct.fromJSON(data);
});
}我得到了
I/flutter (22211): Listen 1
I/flutter (22211): Listen 3
I/flutter (22211): Listen 5
I/flutter (22211): Listen 6
I/flutter (22211): Listen 4
I/flutter (22211): Listen 2
I/flutter (22211): Listen 7 <-- 4 Ct items in the stream
I/flutter (22211): Listen 7
I/flutter (22211): Listen 7
I/flutter (22211): Listen 7
I/flutter (22211): Listen 9
I/flutter (22211): Listen 10 <-- added more of these along the way
I/flutter (22211): Listen 11
I/flutter (22211): Listen 12
I/flutter (22211): Listen 13发布于 2020-05-30 03:44:18
所以如果有人在未来偶然发现这件事,我碰巧找到了解决这个问题的办法。答案是使用await for。
stream.listen()设置将在事件到达时放在事件队列中的代码,然后执行以下代码。
等待事件之间的挂起,并一直这样做,直到流完成,所以在发生之前不会执行跟随它的代码。
await for(String s in stream) { print(s); }https://stackoverflow.com/questions/61847868
复制相似问题