flutter - 颤振对话框有问题,在发现错误后显示黑页
问题描述
我创建了一个Dialog Widgets,当用户登录和注册时它会显示 Dialog+progeress 指示器。像往常一样的对话框。当没有错误(如经过身份验证的用户和密码)时,它可以完美运行,如果您提供它将完美地显示对话框。但是当我输入错误的电子邮件 ID 或密码或犯任何错误时,它会显示一个黑色的空白页面,我需要再次重新启动应用程序。我希望如果我处于注册模式,如果发生错误,它将向我显示错误消息并让我留在登录页面,注册页面也是如此。我用户 Navigator.pop(context)
停止对话,但它会停止对话并向我显示一个黑色的空白页。但是当它发现一个错误时,比如我输入了一个错误的电子邮件,它会将我带到黑色页面,我希望如果在显示消息后发现任何错误,它将让我留在我的登录页面上,这样我就可以输入有效的电子邮件和密码.
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ride_share_app/AllScreen/mainscreen.dart';
import 'package:ride_share_app/AllScreen/registrationScreen.dart';
import 'package:ride_share_app/AllWidgets/progressDailog.dart';
import 'package:ride_share_app/main.dart';
class LogInScreen extends StatelessWidget {
static const String idScreen = 'loginScreen';
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
void loginAutentcatUser(BuildContext context) async {
try {
showDialog(context: context,
builder: (BuildContext contex){
return ProgressDialog(message: 'Authenticating Please wait',);
});
final firebaseUser = (await _firebaseAuth
.signInWithEmailAndPassword(
email: emailController.text, password: passwordController.text)
.catchError((errMsg) {
Navigator.pop(context);
displayToastMessage('Error Msg 01: ' + errMsg.toString(), context);
}))
.user;
if (firebaseUser != null) {
userRef.child(firebaseUser.uid).once().then(
(DataSnapshot snap) {
if (snap.value != null) {
Navigator.pushNamedAndRemoveUntil(
context, MainScreen.idScreen, (route) => false);
displayToastMessage('You are Loggied in', context);
}
else {
Navigator.pop(context);
_firebaseAuth.signOut();
displayToastMessage(
'User does not found, Create new account', context);
}
},
);
} else{
Navigator.pop(context);
displayToastMessage('Error occured', context);
}
} on PlatformException catch (err) {
Navigator.pop(context);
displayToastMessage('Error: 02 '+ err.toString(), context);
}catch (err) {
Navigator.pop(context);
displayToastMessage('Error: 03 ' + err.toString(), context);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Image(
height: 350,
width: 250,
image: AssetImage('images/logo.png'),
),
Text(
'Login As Rider',
style: TextStyle(fontFamily: 'Brand Bold', fontSize: 24),
),
SizedBox(
height: 08,
),
TextField(
controller: emailController,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
icon: Icon(
Icons.email,
color: Colors.black,
),
labelText: 'Email',
labelStyle:
TextStyle(color: Colors.black, fontSize: 15.0)),
),
SizedBox(
height: 08,
),
TextField(
controller: passwordController,
obscureText: true,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
icon: Icon(
Icons.password,
color: Colors.black,
),
labelText: 'Password',
labelStyle:
TextStyle(color: Colors.black, fontSize: 15.0)),
),
SizedBox(
height: 08,
),
ElevatedButton(
onPressed: () {
if (emailController.text.isEmpty ||
!emailController.text.contains(RegExp(
'^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+.[a-z]+.[com]'))) {
displayToastMessage('Email is not valid', context);
}
else if (passwordController.text.isEmpty ||
passwordController.text.length < 8) {
displayToastMessage(
'password must be 9 cherectars', context);
}
else{
loginAutentcatUser(context);
}
},
child: Text('Login')),
TextButton(
onPressed: () {
Navigator.pushNamedAndRemoveUntil(context,
RegistrationScrren.idScreen, (route) => false);
},
child: Text('Create New Account..'))
],
),
),
),
),
);
}
}
这是我用于用户登录的全部代码。
void loginAutentcatUser(BuildContext context) async {
try {
showDialog(context: context,
builder: (BuildContext contex){
return ProgressDialog(message: 'Authenticating Please wait',);
});
final firebaseUser = (await _firebaseAuth
.signInWithEmailAndPassword(
email: emailController.text, password: passwordController.text)
.catchError((errMsg) {
Navigator.pop(context);
displayToastMessage('Error Msg 01: ' + errMsg.toString(), context);
}))
.user;
if (firebaseUser != null) {
userRef.child(firebaseUser.uid).once().then(
(DataSnapshot snap) {
if (snap.value != null) {
Navigator.pushNamedAndRemoveUntil(
context, MainScreen.idScreen, (route) => false);
displayToastMessage('You are Loggied in', context);
}
else {
Navigator.pop(context);
_firebaseAuth.signOut();
displayToastMessage(
'User does not found, Create new account', context);
}
},
);
} else{
Navigator.pop(context);
displayToastMessage('Error occured', context);
}
} on PlatformException catch (err) {
Navigator.pop(context);
displayToastMessage('Error: 02 '+ err.toString(), context);
}catch (err) {
Navigator.pop(context);
displayToastMessage('Error: 03 ' + err.toString(), context);
}
}
解决方案
问题出在这里:
void loginAutentcatUser(BuildContext context) async {
try {
showDialog(context: context,
builder: (BuildContext contex){
.....
.....
}catch (err) {
Navigator.pop(context);
displayToastMessage('Error: 03 ' + err.toString(), context);
}
请注意,您在调用时传递给导航pop
器的上下文是LogInScreen
小部件的上下文,这显然是导航器中的唯一路线,也是您留下黑屏的原因。你应该打电话
Navigator.pop(contex);
使用contex
, 减去t
您命名对话上下文的方式,或者更好地对其进行更明确的说明并将其重命名contex
为更合理的名称,例如dialogContext
:
void loginAutentcatUser(BuildContext context) async {
try {
showDialog(context: context,
builder: (BuildContext dialogContext){
.....
.....
}catch (err) {
Navigator.pop(dialogContext);
displayToastMessage('Error: 03 ' + err.toString(), context);
}
现在它在您的代码中清楚地表明您正在弹出对话框而不是整个路线。
推荐阅读
- tfs - 微软 TFS 研究
- javascript - 对于 javascript 的数组,为什么 [1] ==[1] 返回 false?
- python - 如何有效地从网站搜索功能返回的分页链接列表中抓取页面结果
- bash - 如何使用 bitbucket 管道和分支实现语义版本控制?
- r - 避免在 ggplot2 中按字母顺序重新排序图例
- r - 按行名计算列均值
- protocol-buffers - Protobuf 没有生成我想要的 API
- scala - 替换数据框中的值保持原始值
- android - adjustPan 和 NestedScrollView 的交互
- php - gmail中用蓝线显示的地址和电话号码