Ritesh Malviya
Ritesh Malviya

Reputation: 1

FlutterError: Looking up a deactivated widget's ancestor is unsafe

Exception has occurred.
FlutterError (Looking up a deactivated widget's ancestor is unsafe. At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.)

catch (e) {
  ScaffoldMessenger.of(context)
        .showSnackBar(
      SnackBar(
        content: Text(
            'Error: ${e.toString()}'),
      ),
    );
  }

I made registration page and the firebase is working fine and users are also registered.

But this exception is popping up again and again.

please tell me how to fix

Upvotes: 0

Views: 33

Answers (1)

Rifat Hossain
Rifat Hossain

Reputation: 154

1. Solution by checking if the widget is part of the widget tree:

If the widget gets removed from the widget tree (for example, when navigating to a different screen), calling ScaffoldMessenger.of(context) will cause an error because the context is no longer valid. The mounted property ensures that this doesn’t happen.

catch (e) {
  // Ensure the widget is still mounted before showing the SnackBar
  if (mounted) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('Error: ${e.toString()}'),
      ),
    );
  }
}

2. Solution Using GlobalKey:

  1. No need for context: Since we are using the GlobalKey, you don’t need to pass the context around.

  2. No need to check mounted: This approach doesn't require checking mounted, as the ScaffoldMessenger will manage its state.

import 'package:flutter/material.dart';

/// Define a GlobalKey for the ScaffoldMessenger
final GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey =
    GlobalKey<ScaffoldMessengerState>();

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // Assign the key to the ScaffoldMessenger
      scaffoldMessengerKey: scaffoldMessengerKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SnackBar Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              /// Show the SnackBar using the ScaffoldMessenger key
              scaffoldMessengerKey.currentState?.showSnackBar(
                const SnackBar(
                  content: Text('This is a SnackBar!'),
                ),
              );
            },
            child: const Text('Show SnackBar'),
          ),
        ),
      ),
    );
  }
}

Upvotes: 0

Related Questions