> For the complete documentation index, see [llms.txt](https://eece.gitbook.io/mist-innovation-club-flutter-course-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://eece.gitbook.io/mist-innovation-club-flutter-course-1/dart-fundamentals-3/advanced-asynchronous-programming/streams.md).

# Streams

## Basics of Streams&#x20;

{% embed url="<https://youtu.be/ObxHoXd8x3o>" %}

```dart
import 'dart:async';

void main() {
  // Streams
  var numberStream = NumberGenerator().stream;

  numberStream.listen((data) {
    print(data);
  });
}

class NumberGenerator {
  NumberGenerator() {
    Timer.periodic(Duration(seconds: 1), (t) {
      controller.sink.add(count);

      count++;
    });
  }

  var count = 1;

  final controller = StreamController<int>();

  Stream<int> get stream => controller.stream;
}



```

![](/files/-MHOSnP_yc5ogFMvkVi5)

{% hint style="success" %}
Stream emits  an asynchronous sequence of data.
{% endhint %}

## Types of Stream&#x20;

{% embed url="<https://www.youtube.com/watch?v=V9Qpz9Ar2FI>" %}

There are two types of streams in dart :-&#x20;

* [x] Single Subscription Stream
* [x] Broadcast Stream

{% tabs %}
{% tab title=" Multiple subscription on single subscription stream " %}

```dart
// This will show an error
import 'dart:async';

void main() {
  // Streams
  var numberStream = NumberGenerator().stream;

  final subscription1 = numberStream.listen((data) {
    print(data);
  });

  final subscription2 = numberStream.listen((data) {
    print(data);
  });
}

class NumberGenerator {
  NumberGenerator() {
    Timer.periodic(Duration(seconds: 1), (t) {
      controller.sink.add(count);

      count++;
    });
  }

  var count = 1;

  final controller = StreamController<int>();

  Stream<int> get stream => controller.stream;
}

```

{% endtab %}

{% tab title="Broadcast Stream with multiple subscription" %}

```dart


import 'dart:async';

void main() {
  // Streams
  var numberStream = NumberGenerator().stream.asBroadcastStream();

  final subscription1 = numberStream.listen((data) {
    print(data);
  });

  final subscription2 = numberStream.listen((data) {
    print(data);
  });
}

class NumberGenerator {
  NumberGenerator() {
    Timer.periodic(Duration(seconds: 1), (t) {
      controller.sink.add(count);

      count++;
    });
  }

  var count = 1;

  final controller = StreamController<int>();

  Stream<int> get stream => controller.stream;
}

```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Single Subscription Stream " %}
![](/files/-MHOiEgm9Qk9BDEqgHjI)
{% endtab %}

{% tab title="Broadcast Stream" %}
![](/files/-MHOiLn1xrRHSLAU8egN)
{% endtab %}
{% endtabs %}

## Error Handling in Stream

{% embed url="<https://youtu.be/VaGl3rdp4SM>" %}

```dart
import 'dart:async';

void main() {
  // Streams
  var numberStream = NumberGenerator().stream;

  final subscription1 = numberStream.listen((data) {
    print(data);
  }, onError: (err) {
    //logic for error handling
    print("$err, Error detected !");
  }, cancelOnError: true);
}

class NumberGenerator {
  NumberGenerator() {
    Timer.periodic(Duration(seconds: 1), (t) {
      if (count == 5) {
        controller.sink.addError("Error !!!!");
      }
      controller.sink.add(count);

      count++;
    });
  }

  var count = 1;

  final controller = StreamController<int>();

  Stream<int> get stream => controller.stream;
}

```

![](/files/-MHPJ95qKh2CQ6ZVWNUk)

## Manipulating  Streams

{% embed url="<https://youtu.be/uFw88sFu14s>" %}

```dart
import 'dart:async';

void main() {
  // Streams
  var numberStream = NumberGenerator().stream;

  final subscription1 =
      numberStream.map((i) => i * 3).where((i) => i % 2 == 0).listen((data) {
    print(data);
  });
}

class NumberGenerator {
  NumberGenerator() {
    Timer.periodic(Duration(seconds: 1), (t) {
      controller.sink.add(count);

      count++;
    });
  }

  var count = 1;

  final controller = StreamController<int>();

  Stream<int> get stream => controller.stream;
}

```

![](/files/-MHWb_lrZYEWbf4tfkMM)

## Creating Streams

{% embed url="<https://youtu.be/kN6YItCf3KY>" %}

![](/files/-MHWk8hvmBr_GRdMJOE5)

If you want to explore more about Streams : -

{% embed url="<https://dart.dev/tutorials/language/streams>" %}

{% embed url="<https://api.dart.dev/stable/2.9.3/dart-async/Stream-class.html>" %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://eece.gitbook.io/mist-innovation-club-flutter-course-1/dart-fundamentals-3/advanced-asynchronous-programming/streams.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
