FirebaseUser类未定义。

42

我是Flutter的新手。我在使用Firebase Auth/ Google Auth时遇到了问题。

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

1
你在 Firebase 中设置了 Google Sign-In 方法吗? - Junsu Cho
1
是的,我正在尝试将Google登录添加到我的应用程序中。 - AbdullahTh
6个回答

150

firebase_auth0.18.0版本开始:

在最新的firebase_auth版本中,类FirebaseUser被改为User,类AuthResult被改为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<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();
}

回答写得很好,但是当我尝试让用户登录直到他退出时,我遇到了一个错误。我请求您,您能否回答这个问题?链接 我被卡在这里,请给我指引。 - Shîvam Yadav
同时添加“UserUpdateInfo”的弃用声明,因为现在应使用“firebaseUser.updateProfile”。 - Tiago Santos
非常出色的回答。谢谢亲爱的 :) - Kamlesh
Google已更新了更新个人资料每个属性的代码。例如,如果用户想更改显示名称,则代码将类似于firebaseUser.updateDisplayName(name);谢谢。 - Kamlesh

5
自从 `firebase_auth 0.18.0` 版本以后,类 `FirebaseUser` 已被更改为 `User`。

2

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中,类FirebaseUser被更改为User,类AuthResult被更改为UserCredentail。因此,请将FirebaseUser更改为User


1
这可以是您的登录函数,使用电子邮件和密码作为2020年9月的初始值。Initialize app 是一种新引入的方法,我们必须在使用任何其他 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;
        });
      }
    }
  }

0

运行

flutter pub get

然后重新构建你的应用程序。

这个回答没有解释问题的根源,也没有解决它。 - Javier Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接