【问题标题】:error: The argument type 'String?' can't be assigned to the parameter type 'String', but null check doesn't work错误:参数类型“字符串?”无法分配给参数类型“String”,但 null 检查不起作用
【发布时间】:2022-01-07 23:36:00
【问题描述】:

我是飞镖和颤振的新手,我收到了这个错误:

错误:参数类型“字符串?”不能分配给参数类型“字符串”。

当我尝试从 firebase 获取用户对象的字段并将其传递给 User 构造函数时发生此错误。我尝试了另一篇文章的答案,即对返回的用户对象和 uid 进行空检查,但即使在 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,
  };

非常感谢您提供更详细的答案,谢谢。

【问题讨论】:

  • "即使在 if 语句中,dart 仍然给我这个错误。"您没有显示执行此操作的代码,但您几乎可以肯定检查了一个非局部变量。只有 local 变量可以进行类型提升。见stackoverflow.com/q/65035574

标签: flutter dart dart-null-safety


【解决方案1】:

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

为什么会这样?

这里的一些变量是可空的,也就是说它可能是空的,但是你试图将它分配给一个不可空的变量,所以你得到一个错误。

我不确定它是哪个变量(或者是否不止一个),所以我们将继续假设它是 authResult.user.email 对于这个例子:

我该如何解决?

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

authResult.user.email!

另一种解决方法是提供一些默认值以防原始值为 null,您可以使用 ?? 运算符来做到这一点:

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

只是为了绝对清楚。我认为您不应该提供默认的电子邮件值,电子邮件具有默认值是没有意义的。另外我相信authResult.user.email 只有在用户使用匿名登录时才会为空,所以使用! 应该没有任何问题。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2021-09-30
    • 2021-09-06
    • 1970-01-01
    • 2021-09-22
    • 2021-08-18
    • 2021-12-27
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多