0
0
FlutterDebug / FixBeginner · 4 min read

Fix setState Called After Dispose Error in Flutter

The error setState called after dispose happens when you try to update the UI after the widget is removed from the screen. To fix it, check if the widget is still mounted before calling setState by using if (mounted) setState(() { ... }).
🔍

Why This Happens

This error occurs because Flutter widgets have a lifecycle. When a widget is removed from the screen, its dispose() method is called. If you call setState() after dispose(), Flutter throws an error because the widget no longer exists to update.

This often happens when asynchronous tasks like timers, network calls, or animations try to update the UI after the widget is gone.

dart
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 2), () {
      setState(() {
        // Update UI
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
Output
Unhandled Exception: setState() called after dispose(): _MyWidgetState#xxxx This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree.
🔧

The Fix

To fix this, check if the widget is still mounted before calling setState(). The mounted property is true only while the widget is in the widget tree. This prevents calling setState() after dispose().

dart
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 2), () {
      if (mounted) {
        setState(() {
          // Update UI safely
        });
      }
    });
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
Output
No error. UI updates safely only if widget is still active.
🛡️

Prevention

To avoid this error in the future:

  • Always check mounted before calling setState() inside asynchronous callbacks.
  • Cancel timers, streams, or subscriptions in dispose() to stop updates after widget removal.
  • Use state management solutions that handle lifecycle automatically.
⚠️

Related Errors

Similar errors include:

  • Calling setState during build: Avoid calling setState() synchronously inside build().
  • Updating UI after async snapshot error: Check widget lifecycle before updating UI after async operations.

Key Takeaways

Always check if the widget is mounted before calling setState in async callbacks.
Dispose timers and subscriptions to prevent updates after widget removal.
The mounted property helps avoid calling setState after dispose.
Proper lifecycle management prevents common Flutter UI update errors.