Flutter中Async/Await遇无效赋值:GoogleSignInAccount类型不匹配
问题解决:Async/Await 中的空安全错误
你遇到的这个错误是因为Flutter的空安全机制导致的——现在Flutter默认开启空安全,而你参照的教程大概率是基于Flutter 2.0之前的旧版本编写的,当时还没有引入空安全特性。
错误原因
_googleSignIn.signIn()方法现在返回的是GoogleSignInAccount?(带?表示这是可空类型,用户取消登录时会返回null),但你代码里把它赋值给了非空的GoogleSignInAccount变量,类型不匹配所以触发报错。
两种解决方法
方法1:处理用户取消登录的情况(推荐上线用)
先判断返回值是否为null,若用户取消登录则终止流程,避免程序崩溃:
signInWithGoogle(BuildContext context) async { final FirebaseAuth _firebaseAuth = FirebaseAuth.instance; final GoogleSignIn _googleSignIn = GoogleSignIn(); // 声明为可空类型接收返回值 final GoogleSignInAccount? googleSignInAccount = await _googleSignIn.signIn(); // 用户取消登录时返回null,这里做终止处理 if (googleSignInAccount == null) { // 可以添加提示(比如弹窗/Toast)告知用户取消了登录 return; } // 确认非空后正常使用 final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication; // 后续可继续编写Firebase登录逻辑,比如获取Credential并执行signInWithCredential }
方法2:强制解包(仅测试用,不推荐上线)
如果只是快速测试代码、确定用户不会取消登录,可以用!强制将可空类型转为非空类型,但用户取消登录时会直接崩溃:
signInWithGoogle(BuildContext context) async { final FirebaseAuth _firebaseAuth = FirebaseAuth.instance; final GoogleSignIn _googleSignIn = GoogleSignIn(); // 用!强制解包 final GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn()!; final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication; }
另外补充:你代码里的getCurrentUser()方法也会有类似问题,auth.currentUser返回的是User?,如果要返回非空值,同样需要处理空值情况或者使用!强制解包。
内容的提问来源于stack exchange,提问作者Eza
相关产品推荐
相关产品推荐

