首页 > 解决方案 > 为什么我使用 EmailisVerifiyed bool 得到 stackoverflow 错误?

问题描述

我试图检查用户是否验证他的邮件,然后让登录,如果不是,那么就不行。在尝试了所有解决方案后,我来到了这个。我在 onauthchanges 上使用流,所以我知道这很困难,但这就是我正在尝试的,我有一个包装器''home'',所以如果用户为空,我会返回身份验证页面,如果用户电子邮件验证我试图返回主页。我在互联网上发现了 bool,但是当我启动我的应用程序时,我的包装类中出现堆栈溢出错误,也许任何人都可以检查:

class Wrapper extends StatelessWidget {
  static const route='/Wrapper';
  bool get isEmailVerified => isEmailVerified;

  @override
  Widget build(BuildContext context) {
    //Auth.auth().currentUser.isEmailVerified;
    //final user = Provider.of<UserCredential>(context);

    final user = Provider.of<User>(context);



    if(user== null ){
      return Authenticate();
    }else if(isEmailVerified==true){
      return Homepage();
    }else{
      return Resedpasswort();
    }
    //return Home or Authenticate widget
  }
}

resedpasswort 页面只是为了查看在所有工作中删除此内容时是否有错误。这是我的身份验证页面:


class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  String error;

  //Future<bool> isEmailVerified();

  //create user obj based on FirebasedUser
  Model.User _userFromFirebaseUser(User user) {
    return user != null ? Model.User(uid: user.uid) : null;
  }

  //auth change user stream
  Stream<Model.User> get user {
    return FirebaseAuth.instance.authStateChanges().map(_userFromFirebaseUser);
  }

//sign in anon
  Future signInAnon() async {
    try {
      UserCredential result = await _auth.signInAnonymously();
      User user = result.user;

      return _userFromFirebaseUser(user);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

  //sign in with passwort and email
  Future signIN(String email, String password) async {
    try {
      //if (FirebaseAuth.instance.currentUser.emailVerified) {print('fuckyooooooo');
      UserCredential result = await _auth.signInWithEmailAndPassword(
          email: email.trim(), password: password);
      User user = result.user;
      return _userFromFirebaseUser(user);
    }

    on FirebaseAuthException catch (e) {
      switch (e.code) {
        case 'invalid-email':
          {
            return 'Email is not valid';
          }
        case 'user-disabled':
          {
            return 'Account is not active';
          }
        case 'user-not-found':
          {
            return 'No user found';
          }
        case 'wrong-password':
          {
            return 'wrong password';
          }
        default:
          {
            return 'Please verify you account and restart the App';
          }
      }
    }

    return null;
  }


//register with passwort an email
  Future signUp(String email, String password,) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);

      User user = result.user;
      await user.sendEmailVerification();
      return _userFromFirebaseUser(user);
      //await DatbaseService(uid:user.uid).updateUserData('0','new crew member','100','dfdssf');
      //  return ;

      //user.sendEmailVerification();
      // ( await DatbaseService(uid:user).updateUserData('0','new crew member','100','dfdssf')).user.uid;;
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case 'invalid-email':
          {
            return 'Email is not valid';
          }
        case 'user-disabled':
          {
            return 'Account is not active';
          }
        case 'user-not-found':
          {
            return 'No user found';
          }
        case 'wrong-password':
          {
            return 'wrong password';
          }
        default:
          {
            return 'Unexpected error!';
          }
      }
    }
    return null;
  }

  //resetpassword
  Future sendPasswordResetEmail(String email) async {
    try {
      return await _auth.sendPasswordResetEmail(email: email);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case 'invalid-email':
          {
            return 'Email is not valid';
          }
        case 'user-disabled':
          {
            return 'Account is not active';
          }
        case 'user-not-found':
          {
            return 'No user found';
          }
        case 'wrong-password':
          {
            return 'wrong password';
          }
        default:
          {
            return 'Unexpected error!';
          }
          return null;
      }
    }
  }

  Future signOut() async {
    try {
      return await _auth.signOut();
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
}

这是我未来的方法

Future<bool> isEmailVerified() async {
    User user = await _auth.currentUser;
    return user.isEmailVerified;
  }

标签: firebaseflutterfirebase-authentication

解决方案


看来您正在isEmailVerified递归调用方法。这会导致应用程序崩溃(堆栈溢出错误)。提供方法定义isEmailVerified


推荐阅读