How to easily cancel streams in Flutter

Petrus Nguyễn Thái Học
2 min readFeb 22, 2021


Flutter: automatically disposes StreamSubscription and closes Sink when disposing State<T>.

In a Flutter application, when using mostlyBLoC pattern, RxDart, andStreams, it is easy to forget to cancel StreamSubscription and close Sink/StreamController/Subject when Bloc or State is no longer needed. If you forgot it, it can causes memory leak, more memory consumption and other problems, especially in large applications.

Inspirited by RxSwift DisposeBag and NSObject-Rx, I have created 2 packages disposebag and flutter_disposebag, helps to cancel StreamSubscriptions and close Sinks automatically when disposing State<T>.

Simple usage

  • Step 1: with DisposeBagMixin.

After mark State class with DisposeBagMixin , you can access to DisposeBag provided by this mixin, DisposeBag get bag

  • Step 2: using extensions to add StreamSubscription or Sink to DisposeBag
// extension methods
Future<bool> StreamSubscription.disposedBy(DisposeBag);
Future<bool> Sink.disposedBy(DisposeBag);
Future<bool> Iterable<StreamSubscription>.disposedBy(DisposeBag);
Future<bool> Iterable<Sink>.disposedBy(DisposeBag);


import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_disposebag/flutter_disposebag.dart';

class HomePage extends StatefulWidget {
_HomePageState createState() => _HomePageState();

class _HomePageState extends State<HomePage> with DisposeBagMixin {
final eventS = StreamController<Event>();
HomeBloc bloc;

void initState() {

homeBloc = HomeBloc();
homeBloc.message$.listen((msg) {}).disposedBy(bag);


Widget build(BuildContext context) {
return Container();

When _HomePageState disposes, DisposeBag will cancel all StreamSubscriptions and close all Sinks as well, no need to worry about memory leaks :)).

Have nice day. Thanks for your reading ❤. If you like my article, just follow me on medium, github and twitter.