Why do we use dispose() method in dart code?

dispose method use to release the memory allocated to variables when state object is removed.

For example, if you are using a stream in your application then you have to release memory allocated to streamController. Otherwise your app may get warning from playstore and appstore about memory leakage.


The main purpose is to get a callback where in you can free-up all your resources.

If you have initialized any resource in a State, it is important that you close or destroy that resource when that state is disposed.

For e.g: If you are creating a stream in initState of your StatefullWidget, then it is important that you close that stream in dispose method of that state or else it will cause memory leak.

For more details you can refer following comments which I got from the source code of the dispose method of the StatefulWidget:

Called when this object is removed from the tree permanently. The framework calls this method when this [State] object will never build again. After the framework calls [dispose], the [State] object is considered unmounted and the [mounted] property is false. It is an error to call [setState] at this point. This stage of the lifecycle is terminal: there is no way to remount a [State] object that has been disposed. Subclasses should override this method to release any resources retained by this object (e.g., stop any active animations). {@macro flutter.widgets.subscriptions} If you override this, make sure to end your method with a call to super.dispose(). See also: * [deactivate], which is called prior to [dispose].

Or you can refer the docs: https://api.flutter.dev/flutter/widgets/State/dispose.html

So basically dispose is called when that current state will never be used again. So, if you are having any listeners that are active in that state then they can cause memory leaks and so you should close them.


dispose() method called automatically from stateful if not defined.

In some cases dispose is required for example in CameraPreview, Timer etc.. you have to close the stream.

When closing the stream is required you have to use it in dispose method.

dispose() is used to execute code when the screen is disposed. Equal to onDestroy() of Android.

Example:

@override
void dispose() {
  cameraController?.dispose();
  timer.cancel();
  super.dispose();
}

Tags:

Dart

Flutter