is dispose method is called if navigating screen on top of currenting screen then well the previous screen dispose method is called ?
Answer
Overview
No — when you push a new screen on top of the current one, the previous screen's
text
dispose()text
dispose()Navigation Stack Lifecycle
textInitial State: Stack: [HomeScreen] → HomeScreen.initState() called ✅ → HomeScreen.build() called ✅ Push new screen: Stack: [HomeScreen, DetailScreen] → DetailScreen.initState() called ✅ → DetailScreen.build() called ✅ → HomeScreen.dispose() called? ❌ NO! HomeScreen is STILL in stack Pop back: Stack: [HomeScreen] → DetailScreen.dispose() called ✅ (removed from stack) → HomeScreen.build() called again (receives focus) → HomeScreen.dispose() called? ❌ Not yet (still in stack) Pop HomeScreen (or replace with pushReplacement): Stack: [] → HomeScreen.dispose() called ✅
Code Example
dartclass HomeScreen extends StatefulWidget { _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { void initState() { super.initState(); print('HomeScreen: initState'); // Called once on push } void dispose() { print('HomeScreen: dispose'); // Called when POPPED super.dispose(); } Widget build(BuildContext context) { return ElevatedButton( onPressed: () { Navigator.push(context, MaterialPageRoute( builder: (_) => DetailScreen(), )); // HomeScreen is NOT disposed — just covered }, child: Text('Go to Detail'), ); } }
When is dispose() Called?
| Action | dispose() Called? |
|---|---|
text | ❌ No — previous screen stays in stack |
text | ✅ Yes — screen is removed from stack |
text | ✅ Yes — previous screen is replaced (disposed) |
text | ✅ Yes — removed screens are disposed |
text | ✅ Yes — screens above the target are disposed |
Lifecycle During Push/Pop
dart// What actually happens with widget state: Navigator.push → previous widget deactivated (not disposed) → new widget mounted Navigator.pop → current widget dispose() is called → previous widget reactivated
Practical Implication
dartclass _HomeScreenState extends State<HomeScreen> { StreamSubscription? _subscription; void initState() { super.initState(); // This keeps running even when DetailScreen is on top! _subscription = dataStream.listen((_) => setState(() {})); } void dispose() { _subscription?.cancel(); // Properly cleaned up when actually popped super.dispose(); } }
Key Rule:
is called when a widget is permanently removed from the tree (popped off navigation stack, or conditionally unmounted). Pushing a new route on top merely deactivates the previous screen — it remains alive in memory.textdispose()