【问题标题】:Undefined class 'FirebaseUser'未定义的类“FirebaseUser”
【发布时间】:2020-12-31 00:47:33
【问题描述】:

我是 Flutter 的新手。我对 Firebase 身份验证/Google 身份验证有疑问 FirebaseUser 未定义 代码:

FirebaseAuth _auth = FirebaseAuth.instance;
GoogleSignIn googleSignIn = GoogleSignIn();

Future<FirebaseUser> currentUser() async { // The Issue is here in the Future<>
  final GoogleSignInAccount account = await googleSignIn.signIn();
  final GoogleSignInAuthentication authentication =
      await account.authentication;

  final GoogleAuthCredential credential = GoogleAuthProvider.getCredential(
      idToken: authentication.idToken, accessToken: authentication.accessToken);

  final AuthResult authResult = await _auth.signInWithCredential(credential);
  final FirebaseUser user = authResult.user; // and here as I can't define this FirebaseUser object to return

  return user;
}

Pubspec.yml

dependencies:
  flutter:
    sdk: flutter


  cupertino_icons: ^0.1.3
  firebase_auth: ^0.18.0
  location: ^3.0.2
  page_transition: ^1.1.6
  google_sign_in: ^4.5.1
  flutter_facebook_login: ^3.0.0
  firebase_database: ^4.0.0

我也面临与 AuthResult 相同的问题

final AuthResult authResult = await _auth.signInWithCredential(credential);

【问题讨论】:

  • 你设置的是firebase google登录方式吗?
  • 是的,我正在尝试将 google 登录添加到我的应用中

标签: firebase flutter dart firebase-authentication google-authentication


【解决方案1】:

FirebaseUser 类已更改为 User

试试这个方法

 _registerUser() async {
    try {
      final User? user =
          (await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: emailCtrl.text,
        password: passCtrl.text,
      ))
              .user;
      FirebaseFirestore.instance.collection('users').doc().set({
        'name': nameCtrl.text,
        'uid': user!.uid,
        'email': user.email,
        'isEmailVerified': user.emailVerified, // will also be false
        'photoUrl': user.photoURL, // will always be null
      });
      print("Created");
    } catch (e) {
      print(e.toString());
    }
  }

【讨论】:

    【解决方案2】:

    firebase_auth 0.18.0 起,FirebaseUser 类更改为User

    【讨论】:

      【解决方案3】:

      从版本firebase_auth0.18.0开始:

      在最新版本的firebase_auth 中,FirebaseUser 类更改为UserAuthResult 类更改为UserCredential。因此,将您的代码更改为以下内容:

          Future<User> currentUser() async {
            final GoogleSignInAccount account = await googleSignIn.signIn();
            final GoogleSignInAuthentication authentication =
                await account.authentication;
      
            final GoogleAuthCredential credential = GoogleAuthProvider.credential(
                idToken: authentication.idToken,
                accessToken: authentication.accessToken);
      
            final UserCredential authResult =
                await _auth.signInWithCredential(credential);
            final User user = authResult.user;
      
            return user;
          }
      

      FirebaseUser改为User

      AuthResult改为UserCredential

      GoogleAuthProvider.getCredential()改为GoogleAuthProvider.credential()


      通知用户登录状态更改的onAuthStateChanged 已替换为authStateChanges()

      currentUser() 是一种检索当前登录用户的方法,已替换为属性 currentUser,并且不再返回 Future&lt;FirebaseUser&gt;

      以上两种方法的示例:

      FirebaseAuth.instance.authStateChanges().listen((event) {
         print(event.email);
      });
      

      还有:

      var user = FirebaseAuth.instance.currentUser;
      print(user.uid);
      

      弃用 UserUpdateInfo 类的 firebaseUser.updateProfile 方法。 示例:

      Future updateName(String name, FirebaseUser user) async {
        var userUpdateInfo = new UserUpdateInfo();
        userUpdateInfo.displayName = name;
        await user.updateProfile(userUpdateInfo);
        await user.reload(); 
      }
      

      现在

      import 'package:firebase_auth/firebase_auth.dart' as firebaseAuth;
      Future updateName(String name, auth.User firebaseUser) async {
        firebaseUser.updateProfile(displayName: name);
        await firebaseUser.reload();
      }
      

      【讨论】:

      • 答案写得很好,但是当我尝试登录用户直到他注销时出现错误。我请求你,你能回答这个问题吗? link我卡在这里请给我方向
      • 还添加了 UserUpdateInfo 的弃用,现在是 firebaseUser.updateProfile
      • 令人印象深刻的答案。谢谢亲爱的:)
      • Google 已经更新了用于更新配置文件每个属性的代码。例如。如果用户想要更改显示名称,则代码将类似于 firebaseUser.updateDisplayName(name); 谢谢。
      【解决方案4】:

      由于firebase_auth 0.18.0,类FirebaseUser改为User

      【讨论】:

        【解决方案5】:

        在最新版本的firebase_auth中,FirebaseUser类改为UserAuthResult类改为UserCredentail 。因此将 FirebaseUser 更改为 User

        【讨论】:

          【解决方案6】:

          截至 2020 年 9 月,这可以是您使用电子邮件和密码的登录功能。Initialze 应用是一种新引入的方法,我们必须在使用任何其他 firebase 方法之前至少调用一次。

           Future<void> signin() async {
              final formState = _formkey.currentState;
              await Firebase.initializeApp();
              if (formState.validate()) {
                setState(() {
                  loading = true;
                });
                formState.save();
                try {
                  print(email);
                  final User user = (await FirebaseAuth.instance
                          .signInWithEmailAndPassword(email: email, password: password))
                      .user;
                } catch (e) {
                  print(e.message);
                  setState(() {
                    loading = false;
                  });
                }
              }
            }
          

          【讨论】:

            【解决方案7】:

            运行

            flutter pub get
            

            然后重建您的应用。

            【讨论】:

              猜你喜欢
              • 2020-06-24
              • 1970-01-01
              • 2020-12-12
              • 2017-05-03
              • 2020-08-12
              • 2020-05-11
              相关资源
              最近更新 更多