使用 Flutter,如何在单独的登录页面小部件中显示在 AuthService 类中捕获的 Firebase Auth 错误消息?

Posted

技术标签:

【中文标题】使用 Flutter,如何在单独的登录页面小部件中显示在 AuthService 类中捕获的 Firebase Auth 错误消息?【英文标题】:With Flutter, how can I display Firebase Auth error messages caught within an AuthService class within a separate log in page widget? 【发布时间】:2020-06-29 02:15:09 【问题描述】:

我有一个带有我的注册表单的注册页面,然后我调用了一个 AuthService 类来注册用户,并返回一个映射的自定义 User 类。我可以检查函数调用的结果是否不为空,从而将我的用户导航到主页,但我无法弄清楚如何在我的注册页面中通过 setState 或类似方法实际向用户显示 Firebase Auth 消息,如try/catch 块在我的身份验证服务类中。

这是我的缩写注册屏幕小部件:

class RegistrationScreen extends StatefulWidget 
  @override
  _RegistrationScreenState createState() => _RegistrationScreenState();


class _RegistrationScreenState extends State<RegistrationScreen> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      //abbreviated...
                RoundedButton(
                  onPressed: () async 
                    if (_formKey.currentState.validate()) 
                      dynamic result = await _auth.registerWithEmailAndPassword(email, password, displayName);
                     if (result != null) 
                       Navigator.pushNamedAndRemoveUntil(context, Home.id, (_) => false);
                       
                     
                  
                
  

registerWithEmailAndPassword 在导入的 AuthService 类 auth.dart 中:

class AuthService 
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final _firestore = Firestore.instance;
  //create User object
  User _userFromFirebaseUser(FirebaseUser user) 
    return user != null ? User(uid: user.uid, displayName: user.displayName) : null;
  

  //auth change user stream
  Stream<User> get user 
    return _auth.onAuthStateChanged
    .map(_userFromFirebaseUser);
  

  // register
  Future registerWithEmailAndPassword(String email, String password, String displayName) async 
                      try  
                      AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
                      FirebaseUser user = result.user;

                      return _userFromFirebaseUser(user);
                     catch(e) 
                      print(e);
                     
                       
  

如果我随后使用格式错误的电子邮件对此进行测试,我会正确打印到控制台:

flutter: PlatformException(ERROR_INVALID_EMAIL, The email address is badly formatted., null)

但是如何在我的注册屏幕中使用 PlatformException 来设置状态或类似内容以向用户显示 e.message?

谢谢。

【问题讨论】:

【参考方案1】:

你可以像这样创建一个类;

class Errors 
   static String show(String errorCode) 
     switch (errorCode) 
       case 'ERROR_EMAIL_ALREADY_IN_USE':
         return "This e-mail address is already in use, please use a different e-mail address.";

       case 'ERROR_INVALID_EMAIL':
         return "The email address is badly formatted.";

       case 'ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL':
         return "The e-mail address in your Facebook account has been registered in the system before. Please login by trying other methods with this e-mail address.";

       case 'ERROR_WRONG_PASSWORD':
         return "E-mail address or password is incorrect.";

       default:
         return "An error has occurred";
     
   

然后,当您收到 PlatformException 错误时,您可以像这样向用户显示警告对话框;

try  
   AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
   FirebaseUser user = result.user;

   return _userFromFirebaseUser(user);
 catch(e) 
   print(Errors.show(e.code));   // On this line, call your class and show the error message.
 

【讨论】:

抱歉,您能否澄清一下我应该在哪里调用该类?我不确定如何向用户显示消息 - 我从我的注册屏幕中调用我的 registerWithEmailAndPassword,如果成功,我想触发我的导航器,如果没有,则使用 setState 或类似方法来显示错误。我看不到我如何使用 Result 来区分返回的成功用户或返回的错误,因为错误是在单独的文件中的单独的 AuthService 类中打印的。如果我尝试 if (result ==error) 它没有定义,我仍然需要捕获成功登录。 好的,创建一个errors.dart文件并粘贴这些代码。还要删除 AuthService 上的 try-catch,并检查构建上的 try catch 和结果。它会工作的。在您的构建中只使用一次。如果出现问题,请使用 AlertDialog 进行处理。 我已经从我的 auth.dart 文件中删除了 try/catch 并将它移到了 registration_page.dart 文件中,但是 PlatformException 仍然被抛出在我的 auth.dart 服务文件中,而不是我的 registration_page .dart 注册文件,所以它似乎不起作用。 它应该可以工作。你喜欢“_auth.registerWithEmailAndPassword(email, password, displayName).catchError(onError) ... ” 回复慢抱歉 - 是的,谢谢你,最终得到它的工作!感谢您的建议。

以上是关于使用 Flutter,如何在单独的登录页面小部件中显示在 AuthService 类中捕获的 Firebase Auth 错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 小部件测试中等待未来完成?

颤振:如何显示用户特定的页面?

如何创建所有类和小部件都可以在 Flutter 中使用的通用数据源

在小部件树中检测到 Flutter Duplicate GlobalKey

如何从另一个 dart 文件中调用有状态小部件(有表单)方法?- Flutter

Flutter - 如何对齐(小部件)孙小部件与孩子相同