在Dart中,如何确保流更新在继续之前完成?

时间:2019-01-19 07:55:07

标签: asynchronous dart stream flutter

我正在Dart 2.1.0中进行编程,试图通过侦听自定义流来更新某些状态:

import 'dart:async';

void main() {
  final controller = StreamController<int>();
  final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);

  var seen2x = false;
  divisibleBy2.listen((y) {
    seen2x = y;
  });

  controller.add(2);
  print(seen2x);
}

当我运行它时,它会打印false。显然,print函数的调用比侦听器函数的调用早。状态不会及时更新。

通过await-在controller.add(2)上,我可以直接得到订单:

import 'dart:async';

void main() async {
  final controller = StreamController<int>();
  final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);

  var seen2x = false;
  divisibleBy2.listen((y) {
    seen2x = y;
  });

  await controller.add(2);
  print(seen2x);
}

现在它将打印true。监听器函数在print之前调用。

但是在这种情况下,await为什么会有所不同? StreamController's add() method 返回Future,所以我不确定为什么{ {1}}很重要。实际上,在现实世界中,流网络变得越来越复杂,await有时不足以确保执行顺序。这又是一个问题。

现在,我只想看看await是否是正确的方法。预先感谢。

2 个答案:

答案 0 :(得分:1)

code1 code2 grp1 grp2 dist_km 0 M001 M002 AAA AAA 112 3 M002 M004 AAA AAA 65 之所以与众不同,是因为任何 google.payments.inapp.getPurchases将至少等待一个微任务-无论您等待的值是否为{{1 }} 或不。如果它是await,它将等待其完成;如果已完成,则将等待微任务。如果您在await之后加上Future,它的行为将相同。

通常,Future不知道所有侦听器何时都接收到该事件,尤其是考虑异步侦听器或Stream.asyncMap之类的事情。

答案 1 :(得分:1)

我将为等待流完成时的操作添加一个替代答案。 await for是我一直在寻找的钥匙。

var myStream = CustomCacheManager().getFile(_url);
File fetchedFile;
await for (var fileInfo in myStream) {
  fetchedFile = fileInfo.file;
}

// stream is finished now