Flutter谷歌登录存用户信息报错:String?无法赋值给String
解决Flutter谷歌登录保存用户信息的空安全错误
你的问题核心是Dart空安全机制导致的:User类的部分属性是可空类型(String?),但你的SharedPreferenceHelper的保存方法要求传入非空的String类型,再加上原代码的空判断逻辑有误,才导致错误无法解决。以下是具体修复方案:
1. 修正空判断逻辑
原代码判断result != null没有意义(signInWithCredential成功返回的UserCredential不会为null),应该直接判断userDetails是否非空:
UserCredential result = await _firebaseAuth.signInWithCredential(credential); User? userDetails = result.user; // 改为判断userDetails是否存在 if (userDetails != null) { // 后续保存操作 }
2. 处理可空属性的两种方案
根据你的业务需求,选择以下一种方式把String?转为String:
方案一:空断言运算符(!)(确保属性一定非空时用)
如果确定谷歌登录返回的用户一定有email、displayName等属性,可以用!强制转为非空类型:
if (userDetails != null) { SharedPreferenceHelper().saveUserEmail(userDetails.email!); SharedPreferenceHelper().saveUserId(userDetails.uid); // uid本身是String,无需处理 SharedPreferenceHelper().saveDisplayName(userDetails.displayName!); SharedPreferenceHelper().saveUserProfileUrl(userDetails.photoURL!); }
方案二:空合并运算符(??)(提供默认值,避免空指针)
如果某些属性可能为空(比如用户未设置昵称/头像),给空值设置默认字符串:
if (userDetails != null) { SharedPreferenceHelper().saveUserEmail(userDetails.email ?? ""); SharedPreferenceHelper().saveUserId(userDetails.uid); SharedPreferenceHelper().saveDisplayName(userDetails.displayName ?? "未设置昵称"); SharedPreferenceHelper().saveUserProfileUrl(userDetails.photoURL ?? ""); }
3. 为什么之前的?.和!没用?
?.是可选链运算符,作用是对象为空时返回null,但你的保存方法不接受null,所以用?.会导致传入String?,依然不匹配参数类型。!需要加在可空属性后面,而不是对象本身,你之前可能错误地加在了userDetails上(比如userDetails!.email),但email本身还是String?,所以依然会报错。
内容的提问来源于stack exchange,提问作者SHILPI GIRI
相关产品推荐
相关产品推荐

