首页 > 解决方案 > 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'isEmailVerified'

问题描述

登录时出现上述错误。即使在我确保isEmailVerified()仅在检查当前用户是否为空之后才调用 ,也会引发此异常。

我的authentication.dart文件如下所示:

import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart';

abstract class BaseAuth {
  Future<String> signIn(String email, String password);

  Future<String> signUp(String email, String password);

  Future<FirebaseUser> getCurrentUser();

  Future<void> sendEmailVerification();

  Future<void> signOut();

  Future<bool> isEmailVerified();
}
class Auth implements BaseAuth {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Future<String> signIn(String email, String password) async {
    AuthResult result = await _firebaseAuth.signInWithEmailAndPassword(
        email: email, password: password);
    FirebaseUser user = result.user;
    return user.uid;
  }

  Future<String> signUp(String email, String password) async {
    AuthResult result = await _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
    FirebaseUser user = result.user;
    sendEmailVerification();
    return user.uid;
  }

  Future<FirebaseUser> getCurrentUser() async {
    FirebaseUser user = await _firebaseAuth.currentUser();
    return user;
  }

  Future<void> signOut() async {
    return _firebaseAuth.signOut();
  }

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

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

在里面LoginPage,我检查是这样的:

if(auth.signIn(email, password)!=null)
      {
        if(auth.getCurrentUser()!=null)
          {
            if(auth.isEmailVerified() != null) {
              Toast.show("Login Successful!", context, duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);
              Route route = MaterialPageRoute(builder: (context) => HomePage());
              Navigator.pushReplacement(context, route);
            }
          }
      }

我不知道如何解决这个问题。任何帮助表示赞赏。

标签: firebaseflutter

解决方案


在您的Auth班级中,您的方法具有未来的签名。
您将不得不获得await他们的结果,因为其他条件将需要它。

你可以做:

if((await auth.signIn(email, password))!=null){
      if((await auth.getCurrentUser())!=null){
        if((await auth.isEmailVerified()) != null) {
          Toast.show("Login Successful!", context, duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);
          Route route = MaterialPageRoute(builder: (context) => HomePage());
          Navigator.pushReplacement(context, route);
        }
      }
    }

但是上面的代码片段必须放在一个async方法中。


推荐阅读