Dart中非空局部变量userModel已赋值仍触发空安全错误
问题分析
错误提示non-nullable local variable userModel must be assigned的核心原因是Dart静态分析无法确保userModel在所有代码路径下都被赋值:
- 在
if分支(新用户场景)中,userModel被明确赋值,逻辑合法。 - 在
else分支(老用户场景)中,你仅通过userDoc.fold的右回调给userModel赋值,但如果userDoc是Left状态(比如获取用户数据失败),这个回调不会执行,此时userModel处于未赋值状态,触发空安全校验错误。
解决方案
修改else分支的逻辑,明确处理userDoc的错误状态,确保所有代码路径都有明确的返回值或变量赋值:
FutureEither<UserModel> signInWithGoogle() async { try { final GoogleSignInAccount? googleUser = await _googleSignIn.signIn(); final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth?.accessToken, idToken: googleAuth?.idToken, ); final userCredential = await _auth.signInWithCredential(credential); final user = userCredential.user!; if (userCredential.additionalUserInfo!.isNewUser) { final userModel = UserModel( email: user.email!, id: user.uid, img: user.photoURL!, username: user.displayName!, ); await saveUserData(userModel); return right(userModel); } else { final userDoc = await getUserData(user.email!); // 直接通过fold处理成功/失败两种情况,避免变量未初始化 return userDoc.fold( (failure) => left(failure), (userData) => right(UserModel.fromJson(userData)), ); } } on FirebaseAuthException catch (e, st) { return left( Failure(e.message ?? "Bilinmeyen bir hata oluştu", st), ); } catch (e, st) { return left( Failure(e.toString(), st), ); } }
优化说明
- 移除了单独声明的
userModel变量,直接在对应分支返回结果,从根源避免未赋值风险。 - 老用户分支通过
fold直接处理两种状态:获取数据失败时返回Left(failure),成功时返回Right(UserModel),所有路径都有明确输出。 - 代码逻辑更紧凑,消除了空安全校验的隐患。
内容的提问来源于stack exchange,提问作者Açık Hava
相关产品推荐
相关产品推荐

