【发布时间】:2019-06-13 09:03:42
【问题描述】:
我在 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-ing 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,所以我不确定为什么 await 很重要。事实上,在我的流网络变得更加复杂的实际使用中,await 有时不足以确保执行顺序。这是另一天的问题。
现在,我只想看看await 是否是正确的做法。提前致谢。
【问题讨论】:
-
在
StreamController构造函数中使用sync参数 -
抱歉回复晚了。我确实尝试过,并且不愿意使用它。根据docs,使用同步 StreamController 有很多注意事项,因为它“可用于打破 Stream 上的合同”。在我的测试中,它确实会导致一些奇怪的、意想不到的行为。
-
最后,我意识到像我在流旁边所做的那样改变状态确实不是解决问题的正确方法。我修改了流网络以在最后吐出新状态,而不是在中间改变状态。现在一切正常。
-
好,您最初的“订购”要求一开始听起来很奇怪;-)
标签: asynchronous dart stream flutter