未定义的类“ FirebaseUser”

问题描述

我是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_auth 0.18.0开始:

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

    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<FirebaseUser>

以上两种方法的示例:

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

运行

flutter pub get

然后重建您的应用。

,

这可能是您自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;
        });
      }
    }
  }
,

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

,

firebase_auth 0.18.0 起,类 FirebaseUser 已更改为 User