通过 Flutter for Firebase 重新发送验证

Resend Verification through Flutter for Firebase

当用户尝试注册已创建的帐户时,我无法向他们发送电子邮件验证 link。我正在使用 Flutter 编写代码,使用 Firebase 作为后端数据库。


final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

   abstract class BaseAuth {
     Stream<String> get onAuthStateChanged;
     Future<String> currentUser();
     Future<String> resendVerifyEmail(BaseAuth auth, String email);
   } 

   class Auth implements BaseAuth {...}

   Future<String> currentUser() async {
      final FirebaseUser user = await _firebaseAuth.currentUser();
      print("Getting current user: " + user?.uid);
      return user?.uid;
   }

  Future<String> resendVerifyEmail(BaseAuth auth, String email) async {
    try {
      final FirebaseUser user = await _firebaseAuth.currentUser();
      user.sendEmailVerification();
      return user?.uid;
    } catch (e) {
      print("An Error occurred while sending verification link");
      print(e.toString());
      return null;
    }
   }

在 try 块内,当调用方法 currentUser() 时,代码退出并 returns 到调用 resendVerifyEmail 的方法,而没有完成 try-catch 块。

我很难在调用 resendVerifyEmail 的弹出窗口中重新发送电子邮件验证。

请告诉我使用 Flutter 从 Firebase 发送电子邮件验证的任何替代方法或如何处理。

  void _showVerifyEmailDialog(BuildContext context, String email) {
final BaseAuth auth = AuthProvider.of(context).auth;
showDialog(
  context: context,
  builder: (BuildContext context) {
    // return object of type Dialog
    return AlertDialog(
      title: new Text("Account Already Exists"),
      content: new Text("Please verify account in the link sent to email"),
      actions: <Widget>[
        new FlatButton(
          child: new Text("Resend verification email"),
          onPressed: () {
            Navigator.of(context).pop();
            auth.resendVerifyEmail();   <- Called from this line in login.dart

为什么代码在下面的语句处退出,而没有移动到发送电子邮件的下一行?

final FirebaseUser user = await _firebaseAuth.currentUser();

您似乎在重新发送邮件功能中添加了不必要的项目。以下是我自己的实现方式:

  Future<void> sendEmailVerification() async {
    final FirebaseUser user = await _firebaseAuth.currentUser();
    user.sendEmailVerification();
  }

注册用户后调用即可:

  await Auth().sendEmailVerification();
  await Auth().signOut();

确保将用户注销,以便他们在关闭和打开您的应用程序时无法自动登录。如果用户像这样验证了他的电子邮件,您也应该在登录中添加检查:

  Future<bool> isEmailVerified() async {
    final FirebaseUser user = await _firebaseAuth.currentUser();
    return user.isEmailVerified == null ? false : user.isEmailVerified;
  }

登录时调用即可。