flutter error: This widget has been unmounted, so the State no longer has a context (and should be considered defunct)

10,935

Solution 1

Try to use

Navigator.pop() or Navigator.of(context, rootNavigator: true).pop()

instead of Navigator.of(mounted).pop()) to close Dialog window.

Solution 2

This widget has been unmounted, so the State no longer has a context (and should be considered defunct). Consider canceling any. Ans:

if (mounted) {
  ...
}

Solution 3

this is because you don't dispose of or cancel any subscriptions or controllers.TRr to dispose or cancel subscriptions or controllers.

Share:
10,935
Deepak
Author by

Deepak

Updated on June 05, 2022

Comments

  • Deepak
    Deepak almost 2 years

    when I clicking on login button when my mobile number is wrong then open one error dialog box after that when I clicked okey on dialog box then i got this error.

    I got this message

    This widget has been unmounted, so the State no longer has a context (and should be considered defunct)

    Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.

    class _LoginPageState extends State<LoginPage> {
      final GlobalKey<FormState> _formKey = GlobalKey();
    
      TextEditingController _mobileController = new TextEditingController();
      // TextEditingController _nameController = new TextEditingController();
      // TextEditingController _emailController = new TextEditingController();
      TextEditingController _passwordController = new TextEditingController();
    
      Map<String, String> _authData = {
        'user_name': '',
        'user_email': '',
        'username': '',
        'password': ''
      };
    
      Future _submit() async {
        print('aa' + _authData['username']);
        if (!_formKey.currentState.validate()) {
       
    
          return;
        }
        _formKey.currentState.save();
        try {
          await Provider.of<Auth>(context, listen: false).login(
              _authData['user_name'],
              _authData['user_email'],
              _authData['username'],
              _authData['password']);
    
    
          print('authData_username' + _authData['username']);
          print('authData_password' + _authData['password']);
        } on HttpException catch (e) {
          // } catch (e) {
          var errorMessage = 'Authentication Failed';
          if (e.toString().contains('Entered wrong mobile number!')) {
            errorMessage = 'Entered wrong mobile number!';
            print(errorMessage);
            _showerrorDialog(errorMessage);
          } else if (e.toString().contains('Entered wrong password!')) {
            errorMessage = 'Entered wrong password!';
            _showerrorDialog(errorMessage);
          }
        } catch (error) {
          var errorMessage = 'Please try again later';
          _showerrorDialog(errorMessage);
        }
      }
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            child: ListView(
              children: <Widget>[
                Container(
                  width: MediaQuery.of(context).size.width,
                  height: MediaQuery.of(context).size.height / 3.5,
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                          begin: Alignment.topCenter,
                          end: Alignment.bottomCenter,
                          
                          colors: myGradient2),
                      borderRadius:
                          BorderRadius.only(bottomLeft: Radius.circular(90))),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Spacer(),
                      Align(
                        alignment: Alignment.center,
                        child: Icon(
                          Icons.person,
                          size: 90,
                          color: kWhite,
                        ),
                      ),
                      Spacer(),
                      Align(
                        alignment: Alignment.bottomRight,
                        child: Padding(
                          padding: const EdgeInsets.only(bottom: 32, right: 32),
                          child: Text(
                            'Login',
                            style: TextStyle(color: kWhite, fontSize: 18),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
                Container(
                  height: MediaQuery.of(context).size.height / 2,
                  width: MediaQuery.of(context).size.width,
                  padding: EdgeInsets.only(top: 62),
                  child: Form(
                    key: _formKey,
                    child: Column(
                      children: <Widget>[
                        Container(
                          width: MediaQuery.of(context).size.width / 1.2,
                          // height: 45,
                          child: TextFormField(
                            keyboardType: TextInputType.name,
                            autofocus: false,
                            decoration: InputDecoration(
                              hintText: 'Username.',
                              contentPadding:
                                  EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
                              border: OutlineInputBorder(
                                  borderRadius: BorderRadius.circular(32.0)),
                            ),
                            validator: (input) =>
                                input.length > 10 || input.length < 10
                                    ? "Mobile Number should be valid"
                                    : null,
                            controller: _mobileController,
                            onSaved: (value) {
                              _authData['username'] = value;
                            },
                            // maxLength: 10,
                          ),
                        ),
                        SizedBox(
                          height: 10,
                        ),
                        Container(
                          width: MediaQuery.of(context).size.width / 1.2,
                          // height: 45,
                          child: TextFormField(
                            keyboardType: TextInputType.text,
                            autofocus: false,
                            obscureText: true,
                            decoration: InputDecoration(
                              hintText: 'Password',
                              contentPadding:
                                  EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
                              border: OutlineInputBorder(
                                  borderRadius: BorderRadius.circular(32.0)),
                            ),
                            validator: (input) => input.length < 3
                                ? "Password should be more than 3 characters"
                                : null,
                            controller: _passwordController,
                            onSaved: (value) {
                              _authData['password'] = value;
                            },
                          ),
                        ),
                        Align(
                          alignment: Alignment.centerRight,
                          child: Padding(
                            padding: const EdgeInsets.only(top: 16, right: 32),
                            child: Text(
                              'Forgot Password ?',
                              style: TextStyle(color: Colors.grey),
                            ),
                          ),
                        ),
                        Spacer(),
                        InkWell(
                          onTap: () {
                            _submit();
                          },
                          child: Container(
                            height: 45,
                            width: MediaQuery.of(context).size.width / 1.2,
                            decoration: BoxDecoration(
                                gradient: LinearGradient(
                                  colors: myGradient2,
                                ),
                                borderRadius:
                                    BorderRadius.all(Radius.circular(50))),
                            child: Center(
                              child: Text(
                                'Login'.toUpperCase(),
                                style: TextStyle(
                                    color: Colors.white,
                                    fontWeight: FontWeight.bold),
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
                SizedBox(
                  height: 50,
                ),
                InkWell(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text("Dnon't have an account ?"),
                      Text(
                        "Sign Up",
                        style: TextStyle(color: kGreen),
                      ),
                    ],
                  ),
                  onTap: () {
                    // Navigator.pushNamed(context, '/signup');
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SignupPage()),
                    );
                  },
                ),
              ],
            ),
          ),
        );
      }
    
      void _showerrorDialog(String message) {
        showDialog(
          context: context,
          builder: (ctx) => AlertDialog(
            title: Text(
              'An Error Occurs',
              style: TextStyle(color: Colors.blue),
            ),
            content: Text(message),
            actions: <Widget>[
              FlatButton(
                  child: Text('Okay'), onPressed: () => Navigator.of(mounted).pop())
            ],
          ),
        );
      }
    }