'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 1:[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:[2]
Use this:
if (mounted) {
...
}
Solution 3:[3]
this is because you don't dispose of or cancel any subscriptions or controllers.TRr to dispose or cancel subscriptions or controllers.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | General Grievance |
| Solution 2 | |
| Solution 3 | Akhil |
