dart - Stream 可以一次收听一次还是一般一次收听?

标签 dart flutter bloc

我有这个 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 在停止拥有监听器并再次开始拥有监听器时确实会收到 onCancelonListen 事件,因此您可以避免在没有监听器时工作。 使用 Stream.multi,您必须自己记录所有的听众。

关于dart - Stream 可以一次收听一次还是一般一次收听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620408/

相关文章:

firebase - 使用 copywith 时 Flutter Bloc 状态未更新

dom - 谷歌 Dart : change event for IListElement

flutter - 你应该注入(inject)一个接口(interface)还是它的实现?

dart - 如何将图像适合作为容器小部件的背景图像?

flutter - 为什么 TextEditingController 不能正常工作?

flutter - owner._debugCurrentBuildTarget == this ,不是真的

flutter - flutter_bloc 库中的存储库提供程序在推送新路由时不提供存储库

flutter 中的视频背景

flutter - 从_internallinkedhashmap Flutter获取值(value)