Flutter Null Safety 和 Firebase 身份验证错误

Flutter Null Safety and Firebase authentication error

我正在为我的应用程序使用 flutter 和 firebase。我不知道为什么我在下面的代码中出错。使用降级版本的 flutter(没有空安全)它工作正常但是在迁移到空安全之后,我在这里面临问题。

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();
    }
  }

}

User? user(){} 方法中,我在 return 语句中遇到错误。任何人都可以知道吗??

我认为有一些小错误我无法识别。

错误是:

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

您不能 return 从 listen 回调到 user() 函数范围的内容。

与您现在所拥有的最接近的是 return 一个 Future<User?> 类似这样的东西:

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

您必须在此处 return 一个 Future(或将函数标记为 async,其作用几乎相同),因为 authStateChanges() 来自 Firebase异步,并且在 return 语句运行时尚不可用。

我建议阅读 Flutter/Dart 中的异步行为,例如:

如果它是回调并且必须等待一段时间,那么您必须将您的方法声明为 future。因为 return 类型的用户是未来的,这需要一些时间所以你必须将方法作为未来...

希望这对你有用