错误:无法将参数类型'String?'分配给参数类型"字符串",但 null 检查不起作用



我是飞镖和扑动的新手,我得到了这个错误:

错误:参数类型"String?"无法分配给参数类型"String"。

当我试图从firebase获取用户对象的字段并将其传递给user构造函数时,出现了这个错误。我尝试了另一篇文章中的答案,那就是对返回的用户对象和uid进行null检查,但即使在if语句中,dart仍然会给我这个错误。

以下是发生错误的函数:

Future<UserSchema> signInWithEmailAndPassword(
String email, String password) async {
var authResult = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
return UserSchema(authResult.user.uid, authResult.user.email,
authResult.user.displayName, authResult.user.password);
}

这是用户类:

class UserSchema {
String uid;
String email;
String displayName;
String phoneNumber;
String password;
String city;
String province;
String postCode;
bool hasTransit;
String streetAddress;
UserSchema(this.uid, this.email,this.displayName,this.password,
{this.phoneNumber = '0000000000',
this.postCode = '000000',
this.streetAddress = '000 0000 0000',
this.city = '00',
this.province = '00',
this.hasTransit = false});
Map<String, dynamic> toJson() => {
'uid': uid.trim(),
'displayName': displayName.trim(),
'email': email.trim(),
'phoneNumber': phoneNumber.trim(),
'accountCreated':
DateFormat('dd/MM/yyyy').format(Timestamp.now().toDate()),
'shippingAddress': {
'streetAddress': streetAddress.trim(),
'city': city.trim(),
'PostCode': postCode.trim(),
'province': province.trim(),
},
'hasTransit': hasTransit,
};

我真的很想得到一个更详细的答案,谢谢。

我很难告诉你你必须做的确切更改,因为我不太确定哪个变量有错误,不管怎样,我都会向你解释错误的含义,为什么会发生,以及如何正确处理。

为什么会发生这种情况

这里的某个变量是可以为null的,也就是说它可能是null,但您正试图将它分配给一个不可为null的变量,因此会出现错误。

我不确定它是哪个变量(或者它是否不止一个(,所以我们将假设它是authResult.user.email,例如

我该如何修复它

要修复此问题,可以使用!运算符。如果将bang运算符放在可为null的值之外,则此错误将消失。但请注意,如果该值实际上为null,您的应用程序将崩溃。这是一个危险的运算符,只有在确定值不会为null时才应该使用。

authResult.user.email!

另一种修复方法是在原始值为null的情况下提供一些默认值,可以使用??运算符:

authResult.user.email ?? 'example@email.com';

只是为了绝对清楚。我认为你不应该给一个默认的电子邮件值,一封电子邮件有一个默认值是没有意义的。此外,我相信只有当用户使用匿名登录时,authResult.user.email才会为null,所以使用!应该没有任何问题。

最新更新