Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 430
Deepak Avatar asked Jul 05 '21 12:07

Deepak


People also ask

Why am I seeing these types of errors while using flutter?

If you’re seeing these types of errors while using Flutter, don’t worry – you’re not alone! When you see the error Unhandled Exception: This widget has been unmounted, it means that the widget in question – most likely a StatefulWidget – was removed from the tree before the end of its lifetime. There are a few scenarios in which this can happen:

What is unhandled exception in flutter and how to fix it?

If you’re seeing these types of errors while using Flutter, don’t worry – you’re not alone! When you see the error Unhandled Exception: This widget has been unmounted, it means that the widget in question – most likely a StatefulWidget – was removed from the tree before the end of its lifetime.

What happened to the state Widget?

This widget has been unmounted, so the State no longer has a context (and should be considered defunct). The last version without this problem is 0.53. Sorry can you expand on this issue.

What does unhandled exception this widget has been unmounted mean?

When you see the error Unhandled Exception: This widget has been unmounted, it means that the widget in question – most likely a StatefulWidget – was removed from the tree before the end of its lifetime. There are a few scenarios in which this can happen:


2 Answers

Try to use

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

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

like image 91
Dmitry_Kovalov Avatar answered Oct 21 '22 08:10

Dmitry_Kovalov


Use this:

if (mounted) {
  ...
}
like image 37
5 revs, 3 users 73% Avatar answered Oct 21 '22 09:10

5 revs, 3 users 73%