【问题标题】:Flutter Null Safety and Firebase authentication errorFlutter Null 安全和 Firebase 身份验证错误
【发布时间】:2021-12-30 01:29:13
【问题描述】:

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

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(){} 方法中,我在返回语句中遇到错误。任何人都可以知道它吗??

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

错误是:

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

【问题讨论】:

  • “我在返回语句中遇到错误”请编辑您的问题以显示您获得的确切错误消息和堆栈跟踪。
  • @FrankvanPuffelen:我已经用确切的错误消息编辑了问题。

标签: flutter firebase-authentication dart-null-safety


【解决方案1】:

您不能从 listen 回调中将某些内容返回到您的 user() 函数的范围内。

与您现在最接近的方法是返回 Future<User?>,如下所示:

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

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

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

【讨论】:

  • 感谢您的指导......它真的帮助了我......
【解决方案2】:

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

希望这对你有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2018-10-30
    • 2019-01-20
    • 1970-01-01
    • 2021-10-11
    • 2019-01-05
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多