StreamController<\nT>.broadcast 构造函数

StreamController<\nT>.broadcast(\n
  1. {\nvoid onListen(\n
      )?,
    1. void onCancel(\n
        )?,
      1. bool sync = false}\n
      )

      一个允许多次监听的控制器。

      stream 返回的 Stream 是一个广播流。它可以被多次监听。

      一个流应该在没有任何订阅者监听时保持空闲(使用 onListen 回调来启动事件生成)。如果没有用户监听流,流不应泄露资源(如 websockets)。

      在没有监听者时,广播流不会缓冲事件。

      在调用 addaddErrorclose 时,控制器会将任何事件分配给当时所有订阅的监听者。不允许在之前的调用返回之前调用 addaddErrorclose。控制器没有事件的内部队列,如果在事件或错误添加时没有监听者,它将直接被丢弃。

      每个订阅处理都是独立进行的,如果其中一个监听器暂停,只有暂停的监听器受到影响。一个暂停的监听器将内部缓冲事件,直到取消暂停或取消订阅。

      如果 sync 为 true,事件可以在 addaddErrorclose 调用期间直接由流订阅触发。返回的流控制器是一个 SynchronousStreamController,必须谨慎并注意使用,以防止违反 Stream 合同。有关同步分发的使用说明,请参阅 Completer.sync。如果有疑问,请保持控制器非同步。

      如果 sync 为 false,事件将在事件添加的代码完成后在稍后的时间触发。在这种情况下,不保证多个监听器何时获得事件,除了每个监听器将按正确顺序获得所有事件外。每个订阅都单独处理事件。如果异步控制器上有两个监听器发送了两个事件,其中一个监听器可能会在另一个监听器收到任何消息之前收到这两个事件。要接收事件,监听器必须在事件初始化(即调用 add 时)以及稍后事件送达时进行订阅。

      当第一个监听器订阅时调用 onListen 回调,没有活跃的监听器时调用 onCancel

      实现

      factory StreamController.broadcast(
          {void onListen()?, void onCancel()?, bool sync = false}) {
        return sync
            ? _SyncBroadcastStreamController<T>(onListen, onCancel)
            : _AsyncBroadcastStreamController<T>(onListen, onCancel);
      }