Flutter校验Firestore用户文档存在性时报GoogleSignIn类型赋值错误
问题现象
在Flutter项目中校验Firestore用户文档是否存在时抛出类型不匹配错误:
类型为'GoogleSignInAccount? Function()'的值无法赋值给类型为'GoogleSignInAccount'的变量。
- 报错位置:
lib/services/authentication_service.dart:33 - 关联依赖:
package:google_sign_in/google_sign_in.dart(版本5.3.3) - 原触发报错代码行:
GoogleSignInAccount googleSignInAccount = googleSignin.currentUser!;
涉及的业务逻辑为:实例化GoogleSignIn获取当前登录用户,查询Firestore中对应用户ID的文档判断数据是否存在,相关代码片段如下:
Future<bool?> checkUserInFirestore(BuildContext context) async { try { final GoogleSignin googleSignin=GoogleSignin(); GoogleSignInAccount? googleSignInAccount = googleSignin.currentUser; if (googleSignInAccount == null) return null; final doc = await users.doc(googleSignInAccount.id).get(); bool isExist = doc.exists; return isExist; } catch (error) { displayMessage(error.toString(), context); } return null; }
错误原因
核心问题是类名拼写错误:
google_sign_in包提供的登录类名是GoogleSignIn(遵循大驼峰命名,Sign和In两个单词首字母均大写),代码中写的是GoogleSignin(In的首字母i小写),属于未定义的类型,Dart静态分析将其推导为dynamic类型,导致后续访问currentUser时类型识别错误,把属性识别成了返回GoogleSignInAccount?的无参函数,最终触发类型不匹配报错。
除此之外,在方法内部重复实例化GoogleSignIn的写法也有问题,会导致登录状态获取不一致。
修复方案
- 修正类名拼写,将所有写错的
GoogleSignin替换为正确的GoogleSignIn - 不要在方法内部重复实例化登录对象,使用单例实例维护登录状态,避免状态异常
- 移除多余的非空强转
!,保留原有的空判断逻辑即可,避免空指针崩溃
修复后的完整代码参考:
// 将GoogleSignIn实例定义为全局单例/认证服务类的成员变量,不要每次调用方法都新建实例 final GoogleSignIn googleSignIn = GoogleSignIn(); final CollectionReference users = FirebaseFirestore.instance.collection('users'); Future<bool?> checkUserInFirestore(BuildContext context) async { try { GoogleSignInAccount? googleSignInAccount = googleSignIn.currentUser; if (googleSignInAccount == null) return null; final doc = await users.doc(googleSignInAccount.id).get(); return doc.exists; } catch (error) { displayMessage(error.toString(), context); } return null; }
额外排查点
如果修正类名后仍然报错,执行以下命令清理缓存重新拉取依赖即可:
flutter clean flutter pub get
内容的提问来源于stack exchange,提问作者mohamed alaa
相关产品推荐
相关产品推荐

