flutter error: This widget has been unmounted, so the State no longer has a context (and should be considered defunct)
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.
Deepak
Updated on June 05, 2022Comments
-
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()) ], ), ); } }