我已经开发了一个登录页面,如果电子邮件和密码匹配从数据库成功登录的,并移动到新的页面,但如果它的错误,我想显示一个错误消息电子邮件或密码不匹配。
下面是我的代码:
class _AdminLoginState extends State<AdminLogin> {
String _username, _password;
TextEditingController _email = TextEditingController();
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('LOGIN'),
backgroundColor: Colors.indigo[900],
),
body: SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
padding: const EdgeInsets.only(top: 50),
child: SizedBox(
height: 150.0,
width: 300,
child: Image.asset("assets/admin.png",
fit: BoxFit.contain,),
),
),
Container(
child: Text("ADMIN",style: TextStyle(fontSize: 15,fontWeight: FontWeight.bold,color: Colors.indigo),),
),
Container(
padding: const EdgeInsets.only(bottom: 50),
child: Column(
children: <Widget>[
SingleChildScrollView(
child: Form(
key: _formkey,
child: Column(
children: <Widget>[
SizedBox(
height: 60,
),
SizedBox(
width: 380,
height: 70,
child: Container(
padding: EdgeInsets.all(4),
width: 500,
height: 60,
child: TextFormField(
autofocus: false,
obscureText: false,
keyboardType: TextInputType.emailAddress,
validator:(input){
if(input.isEmpty){
return 'please type username';
}
return null;
},
onSaved: (input) => _username =input ,
decoration: InputDecoration(
labelText: 'Email',
hintText: "Email",
labelStyle: TextStyle(
color: Colors.black,
fontSize: 16,
),
border: new OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(20.0),
),
),
),
),
),
),
SizedBox(
width: 380,
height: 70,
child: Container(
padding: EdgeInsets.all(4),
width: 400,
height: 60,
child: TextFormField(
autofocus: false,
obscureText: true,
validator:(input){
if(input.isEmpty){
return 'please type Password';
}
return null;
},
onSaved: (input) => _password =input ,
decoration: InputDecoration(
labelText: 'Password',
hintText: "Password",
labelStyle: TextStyle(
color: Colors.black,
fontSize: 16,
),
border: new OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(20.0),
),
),
),
),
),
),
Container(
padding: EdgeInsets.all(4),
width: 500,
height: 60,
child: RaisedButton(
onPressed: login,
textColor: Colors.white,
color: Colors.indigo[900],
child: Text('Login'),
),
)
],
),
),
),
],
),
),
],
),
),
);
}
Future<void> login() async{
final formState = _formkey.currentState;
if(formState.validate()){
formState.save();
try{
final FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _username, password: _password)).user;
Navigator.push(context, MaterialPageRoute(builder: (context) => Admin()));
}catch(e){
print(e.message);
}
}
}
}
这将是真正有帮助的,如果有人也帮助我在验证正确的电子邮件格式,并给予适当的验证密码
5条答案
按热度按时间vlf7wbxs1#
如果尝试不成功,signInWithEmailAndPassword()将返回一个带有特殊代码的异常。
为了打印消息,您需要在signInWithEmailAndPassword()方法中添加一个catch块,然后就可以使用错误消息了。
示例:
出于安全考虑,我建议将一些邮件合并在一起,而不是给可能的攻击者一个提示,告诉他们电子邮件是否已经在系统中。
我不知道如何使用Flutter,所以我只能给一个想法;
在这里,您直接尝试从方法取得使用者。
相反,我会建议使用这样的东西(这是有Angular 的,但我认为你可以很容易地适用于Flutter与一些修改)
您可以在此处找到它可能返回的错误类型:https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#signinwithemailandpassword
7d7tgy0s2#
在
InputDecoration
中使用errortext
以下是演示
希望能帮上忙。
cxfofazt3#
下面@Jaydeepchatrola回答的
我使用了一个try catch块,并检查了密码是否无效或电子邮件,以获得更好的结果!
dgsult0t4#
你需要捕捉具体的错误。我自己有问题,用这个代码我解决了问题。
5lwkijsr5#
1.添加rflutter_alert:^2.0.4,位于项目文件pubspec.yaml的依赖项下:并保存它
1.将
import 'package:rflutter_alert/rflutter_alert.dart';
添加到验证屏幕的文件中1.加了
警报(上下文:上下文、标题:"登录失败",说明:"电子邮件或密码不正确。"). show();
在第(e)条中{}
就像这样: