当我点击登录按钮时,我的手机号码是错误的,然后打开一个错误对话框后,当我点击对话框上的okey,然后我得到了这个错误。
我收到这条信息
此小部件已卸载,因此State不再具有上下文(应视为已失效)
考虑在"dispose"期间取消任何活动的工作,或者使用"mounted" getter来确定State是否仍然处于活动状态。
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())
],
),
);
}
}
4条答案
按热度按时间ddrv8njm1#
尝试使用
Navigator.pop()
或Navigator.of(context, rootNavigator: true).pop()
而不是
Navigator.of(mounted).pop())
来关闭对话框窗口。vfwfrxfs2#
请使用此选项:
kjthegm63#
这是因为您没有释放或取消任何订阅或控制器。请键入TRr以释放或取消订阅或控制器。
5vf7fwbs4#
在你的MaterialApp小部件中添加一个GlobalKey来保存状态,然后使用
navigatorKey.currentState?.pop()
弹出一个屏幕。你也可以使用navigatorKey.currentState?.pushNamed(routeName)
,pushReplacementNamed
...