flutterdartflutter-layoutflutter-dependenciesflutter-test

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


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())
        ],
      ),
    );
  }
}


Solution

  • Try to use

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

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