Search code examples
flutterfirebase-authenticationdart-null-safety

Flutter Null Safety and Firebase authentication error


I am using flutter and firebase for my app. I don't know why I am getting error in below code. With degrade version of flutter(Without null safety) it is working fine but after migrating over null safety, I am facing problem here.

class AuthenticationService {

  final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final firebaseUser = FirebaseAuth.instance.currentUser;

  users.User? _userFromFirebase(User user){
    return user != null ? users.User(id: user.uid, email: user.email):null;
  }

  User? user() {
    firebaseAuth.authStateChanges().listen((User? user) {
      if(user == null){
        return null;
      } else {
        return user; //I am getting error here in return statement
      }
    });
  }
  Future loginWithEmail({required String email, required String password}) async {
    try{
      UserCredential result = await firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
      User? user = result.user;
      return _userFromFirebase(user!);
    } catch (e) {
      return e.toString();
    }
  }

  Future register({required String email, required String password}) async {
    try{
      UserCredential result = await firebaseAuth.createUserWithEmailAndPassword(email: email, password: password);
      User? user = result.user;
      return _userFromFirebase(user!);
    } catch (e) {
      return e.toString();
    }
  }

}

In User? user(){} method, I am getting error in return statement. Can anyone have idea about it??

I think some small mistake is there which I am not able to identifying it.

The error is :

Error: Can't return a value from a void function.

Solution

  • You can't return something from within the listen callback to the scope of your user() function.

    The closest equivalent to what you have now is to return a Future<User?> with something like this:

    Future<User?> user() {
      return firebaseAuth.authStateChanges().first()
    }
    

    You have to return a Future here (or mark the function as async, which does pretty much the same thing) because the authStateChanges() comes from Firebase asynchronously, and won't yet be available by the time the return statement runs.

    I recommend reading up on asynchronous behavior in Flutter/Dart, for example with: