首页 > 解决方案 > 颤振对话框有问题,在发现错误后显示黑页

问题描述

我创建了一个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);
    }
  }

此代码表明,如果发生任何错误或捕获它,它将用于Navigator.pop(context) 停止对话。 此图显示对话框和进度指示器

但是当它发现错误时,比如我输入了错误的电子邮件,它会将我带到黑页,我希望如果它在显示消息后发现任何错误,它将让我留在我的登录页面

标签: flutterflutter-layout

解决方案


问题出在这里:

 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);
    }

现在它在您的代码中清楚地表明您正在弹出对话框而不是整个路线。


推荐阅读