D
OOP & SOLIDHard40 XP5 min read

How do Streams work in Dart and what is the difference between single and broadcast streams?

TL;DR: Streams represent asynchronous sequences of values. Single-subscription streams can have one listener (file reads, HTTP responses). Broadcast streams support multiple listeners (user events, BLoC state). StreamController creates streams imperatively.

Full Answer

A Stream<T> is like an asynchronous Iterable<T>. Instead of pulling values synchronously, you subscribe and values are pushed to you as they arrive.

Single vs Broadcast

AspectSingle SubscriptionBroadcast
ListenersOne onlyMultiple simultaneous
BufferingBuffers until listener attachedNo buffering โ€” misses events
Use casesFile read, HTTP responseUI events, BLoC streams
CreateStreamController<T>()StreamController<T>.broadcast()
๐ŸŽฏ

BLoC uses broadcast StreamControllers internally so multiple widgets can listen to the same state stream simultaneously without 'already has a listener' errors.

Code Examples

dartStreamController and stream transformations
Output
Listener 1: Hello
Listener 2: Hello
Listener 1: World
Listener 2: World
4
16

Common Mistakes

  • โœ—Forgetting to close() StreamControllers โ€” causes memory leaks (stream stays open forever)
  • โœ—Listening to a single-subscription stream twice โ€” throws 'Stream has already been listened to'

Interview Tip

๐Ÿ’ก

BLoC pattern is built on broadcast streams. Understanding single vs broadcast explains why BLoC uses StreamController.broadcast() and why you can have multiple BlocBuilders listening to the same bloc.

#stream#StreamController#broadcast#async