无法将“OAuthCredential”类型的值分配给“GoogleAuthCredential”类型的变量

Posted

技术标签:

【中文标题】无法将“OAuthCredential”类型的值分配给“GoogleAuthCredential”类型的变量【英文标题】:A value of type 'OAuthCredential' can't be assigned to a variable of type 'GoogleAuthCredential' 【发布时间】:2022-01-03 11:02:21 【问题描述】:

这是我的谷歌登录代码..

             onPressed: () async
                final GoogleSignInAccount newuser= await GoogleSignIn().signIn();
                final  GoogleSignInAuthentication newuserauth= await 
         googleUser.authentication;
                final GoogleAuthCredential cred= GoogleAuthProvider.credential(accessToken: 
                 newuserauth.accessToken,idToken: newuserauth.idToken);
                await FirebaseAuth.instance.signInWithCredential(cred);
              ,

我得到的错误如下..

        error: A value of type 'OAuthCredential' can't be assigned to a variable of type 
        'GoogleAuthCredential'. (invalid_assignment at [firebase] lib\firstpage.dart:147)

        error: Undefined name 'googleUser'. (undefined_identifier at [firebase] 
            lib\firstpage.dart:145)
         error: A value of type 'GoogleSignInAccount?' can't be assigned to a variable of type 
        'GoogleSignInAccount'. (invalid_assignment at [firebase] lib\firstpage.dart:144)

这些是我的 pubspec.yaml 中的依赖项。

      dependencies:
        flutter:
          sdk: flutter
           firebase_auth: ^3.2.0
           firebase_core : ^1.10.0
           flutter_spinkit: ^5.1.0
           cloud_firestore: ^3.1.0
           google_sign_in: ^5.2.1

【问题讨论】:

【参考方案1】:

您的代码存在多个问题,如下所示:

第 2 行:GoogleSignIn().signIn() 返回GoogleSignInAccount?,这意味着它可能为空,但您使用的是GoogleSignInAccount,这意味着它不能为空,,所以将其更改为(这是您遇到的最后一个错误):

   final GoogleSignInAccount? newuser= await GoogleSignIn().signIn();

第 3 行和第 4 行:您使用了变量名 newuser 而不是 googleUser 更改其中之一(第二个错误)

第 5 行和第 6 行:GoogleAuthProvider.credential(..) 返回 OAuthCredential 而不是 GoogleAuthCredential,这是您遇到的第一个错误。

但是,使用final,您无需指定变量类型,这是 Dart 的优势之一。

此外,您会在newuser.authentication 上收到错误,因为如前所述,newuser 可能为 null,因此您无法访问 authentication... 我喜欢这样做,因为我不喜欢处理空值就是在使用它之前从函数返回,如果它是空的。

所以整个代码将是(我添加了类型,以便您可以看到差异,但您不需要它们):

final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
if (googleUser == null) return null;
  
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final OAuthCredential credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );
await FirebaseAuth.instance.signInWithCredential(credential);

【讨论】:

以上是关于无法将“OAuthCredential”类型的值分配给“GoogleAuthCredential”类型的变量的主要内容,如果未能解决你的问题,请参考以下文章

js中相等与不等

如何用sql语句将一个字段的值加1-MS-SQLServer/疑难问题

浅析ARP协议及ARP攻击

无法将类型“[PHAsset]”的值分配给类型“UIImageView!”

无法将 [Struct] 类型的值快速转换为 [string] 类型

Swift“无法将''类型的值转换为'String'类型