我有这个 StreamController:
StreamController<Workout> _selectedWorkoutSubject = new StreamController()
我像这样在 StreamBuilder 中收听它:
StreamBuilder(
stream: workoutBloc.selectedWorkoutStream,
builder: (BuildContext context, AsyncSnapshot<Workout> snapshot) {
if (snapshot.hasData) {
return ...
} else {
return Text('loading...');
}
}
);
当我离开当前页面并返回时,出现异常:Bad state: Stream has already been listened to.
我知道我一次只能做一次,但这不是我正在做的吗?当我离开页面时,StreamBuilder 应该收集释放流的垃圾,以便其他东西可以收听它。
或者一个 Stream 通常只能被收听一次(不是一次一次)?我知道我可以做到
StreamController<Workout> _selectedWorkoutSubject = new StreamController.broadcast();
但我试图理解为什么它不像我最初那样工作。
最佳答案
这不是“一次一个”。传统的非广播流只能收听一次。它只允许一个监听器,当该监听器取消时,流会自行清理并且不会再次工作。
一个传统的广播流可以被多次收听,但所有并发的收听者都得到相同的事件。
大多数 Stream
构造函数和 StreamController
创建传统的“单一订阅”流或广播流。
添加了另一种创建可以多次收听的流的方法:Stream.multi
构造函数。
这样,您就可以单独处理每个 listen
调用,并向它们发送您想要的任何事件,而不一定是所有监听器都具有相同的值(每个 listen
调用都有自己的独立 StreamController
).
您可以使用它来实现广播流的行为,但您不必这样做。
除此之外,使用广播流是您的最佳选择。广播流 Controller 在停止拥有监听器并再次开始拥有监听器时确实会收到 onCancel
和 onListen
事件,因此您可以避免在没有监听器时工作。
使用 Stream.multi
,您必须自己记录所有的听众。
关于dart - Stream 可以一次收听一次还是一般一次收听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620408/