flutter - Flutter:重置密码将我带到主页而不是返回登录页面
问题描述
我是 Flutter 的新手,当我在重置密码上按下提交时,会发送一封重置电子邮件,但是我被导航到我的主页而不是返回我的登录页面。我究竟做错了什么。
代码如下:
import 'package:flutter/material.dart';
import 'stacked_icons.dart';
import 'auth.dart';
class LoginPage extends StatefulWidget {
LoginPage({this.auth, this.onSignedIn});
final BaseAuth auth;
final VoidCallback onSignedIn;
@override
State<StatefulWidget> createState() => _LoginPage();
}
enum FormType {
login,
register,
reset
}
class _LoginPage extends State<LoginPage> {
final formKey = new GlobalKey<FormState>();
String _email;
String _password;
String _name;
FormType _formType = FormType.login;
bool validateAndSave() {
final form = formKey.currentState;
if (form.validate()) {
form.save();
return true;
}
return false;
}
void validateAndSubmit() async {
if (validateAndSave()) {
try {
if (_formType == FormType.login) {
String userId = await widget.auth.singInWithEmailAndPassword(_email, _password);
print('Signed in: $userId');
} else if (_formType == FormType.reset){
await widget.auth.sendPasswordResetEmail(_email);
print("Password reset email sent");
//Navigator.of(context).pushReplacementNamed ('moveToReset');
setState(() {
_formType = FormType.login;
});
} else if (_formType == FormType.register){
String userId = await widget.auth.createUserWithEmailAndPassword(_email, _password, _name);
print('Registered user: $userId');
setState(() {
_formType = FormType.login;
});
}
widget.onSignedIn();
} catch (e) {
print('Error: $e');
showDialog(
context: context,
builder: (context){
return AlertDialog(
title: Text('Sign in failed'),
content: Text(e.toString()),
actions: [
FlatButton(
child: Text('OK'),
onPressed: () => Navigator.of(context).pop(),
),
],
);
}
);
}
}
}
void moveToRegister(){
formKey.currentState.reset();
setState(() {
_formType = FormType.register;
});
}
void moveToLogin(){
formKey.currentState.reset();
setState(() {
_formType = FormType.login;
});
}
void moveToReset(){
formKey.currentState.reset();
setState(() {
_formType = FormType.reset;
});
}
这是提交按钮的片段
else if (_formType == FormType.reset){
return [
new Row(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.only(
left: 20.0, right: 20.0, top: 10.0),
child: GestureDetector(
onTap: () {
validateAndSubmit();
},
child: new Container(
alignment: Alignment.center,
height: 60.0,
decoration: new BoxDecoration(
color: Color(0xFF18D191),
borderRadius: BorderRadius.circular(10.0)),
child: new Text(
"Submit",
style: new TextStyle(
fontSize: 20.0, color: Colors.white),
),
),
),
),
),
],
),
请发送正确的代码以在重置后导航回登录。
我试过 Navigator.pushReplacementNamed 但是我不知道如何实现字符串。
我也尝试过 Navigator.pop,当我按下提交按钮时,我收到错误消息。
我的假设是 setState 可以完成这项工作,但我看到它不起作用,或者我没有正确放置它。
如上所述,我对 Flutter 还是新手,并试图找出我哪里出错了。
解决方案
您没有根据您的用例正确处理您的重置案例。有注释掉的导航代码可以将您导航到 moveToReset 页面。
//Navigator.of(context).pushReplacementNamed ('moveToReset');
我建议使用您的moveToLogin()
方法并更改其逻辑以包含到实际登录页面的导航。它的方法名称会误导它包含的当前逻辑。
https://flutter.dev/docs/cookbook/navigation/named-routes
可能的解决方案:
定义一个 ResetPage Widget 和到它的路由。将以下内容添加到您的 validateOnSubmit 中
else if(_formType == FormType.reset)
Navigator.pushNamed(context, '/yourResetPageRoute');
这样,您将使用路由器和新页面。
- 另一个简单地显示重置表单的选项是您在第二个代码片段中启动的方法。在那里您返回一个小部件(行),您可以向其中添加一个重置表单。这不是单独的页面,也不使用路由。
推荐阅读
- python - MongoEngine QuerySet 两次插入调用默认函数
- macos - 程序退出时是否可以运行 Automator 工作流程?
- kotlin - 为什么作者将taskRepository.refreshTasks() 与viewModelScope.launch 包装起来?
- php - 创建多级菜单 php Laravel
- c - 如何从 POSIX 升级到
,C11标准? - python - 我正在开发一个使用 Django 的 Web 应用程序,在 Nginx 上运行,我收到 111 连接被拒绝,我不知道为什么
- android - 在文件管理器android中打开外部SD卡路径
- python - SQLAlchemy 中的 double equal == 语法如何工作
- apache-camel - Apache camel 在多个节点上运行
- python - 在使用 Python 访问 API 以获取 json 请求之前,轮换代理 IP