/dispose

A handler to correctly dispose listeners, timers, controllers...

Primary LanguageDartGNU General Public License v3.0GPL-3.0

Are you tired of having to cancel subscriptions, timers and close controllers?

Have you ever created an Angular Component or Flutter Widget that has some Stream being listened or Timer that are still executed after the component or widget destruction?

Then you have to bind a variable to the subscription so you can cancel it on the component destruction?

Not to mention that if your Timer/Stream is unique you have to cancel it before reassigning it again.

This all happens because there isn't really a connection between your component/widget to the stream/timer/controller.

Well, this package aims to help you with that.

The package exposes a Disposable class that has a dispose() function that clears any listeners, timers, controllers etc that were created within it. You can make the objects unique by setting a paramater Symbol uniqueId in your calls.

There is also a Angular class that already disposes stuff on OnDestroy (package:dispose/angular.dart).

In the examples below you have to call the dispose() method of SomeClass somewhere. Usually in widget/component destruction.

Examples:

import 'package:dispose/dispose.dart';  

each

It iterates through the stream and disposes the listener within dispose().
Example:

  
class SomeClass extends Disposable {  
  void listenToInts(Stream<int> myIntStream) {  
    each(myIntStream, (int value) {  
      print('someInt $value');  
    }, uniqueId: #MyUniqueListener);  
  }  
}  

controller

It creates a StreamController<T> that is closed within dispose().
Example:

  
class SomeClass extends Disposable {  
  late StreamController<int> _intController;  
    
  SomeClass() {  
    _intController = controller(broadcast: false);  
  }  
}  

timer

It creates a Timer that is cancelled within dispose() if it wasn't already executed.
Example:

  
class SomeClass extends Disposable {  
  void method() {  
    timer(Duration(seconds: 5), () => print('Executed!'));  
    // the above timer will be free in dispose() if not executed  
  }  
}  

periodic

It creates a Timer.periodic that is cancelled within dispose().
Example:

  
class SomeClass extends Disposable {  
  void method() {  
    var x = 0;  
    periodic(Duration(seconds: 5), ()   
      => print('Executed ${++x}'));  
  }  
}  

bind

Binds another Disposable object that will be freed along in dispose().
Example:

class SomeOtherClass extends Disposable {
  Timer myPeriodic;
  SomeOtherClass() {
    myPeriodic = periodic(Duration(seconds: 30));
  }
}  
class SomeClass extends Disposable {  
  final prop = SomeOtherClass();

  SomeClass() {
    // prop will be disposed in SomeClass.dispose() if
    // it wasn't already.
    bind(prop);
  }
}