使用 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 Duplicate GlobalKey