Arg 类型 'String? Function(String)' & 'void? Function(String)' 不能分配给参数类型 String?函数(字符串?)?无效?函数(字符串?)?

Arg type 'String? Function(String)' & 'void? Function(String)' can't assigned to param type String? Function(String?)? and void? Function(String?)?

我在检查电子邮件值是否为空时收到 dart 中的参数类型不可分配错误,我收到的错误是

The argument type void Function(String) can't be assigned to the parameter type void Function(String?)?.

The argument type String? Function(String) can't be assigned to the parameter type 'String? Function(String?)?.

这些是验证器 类,

class EmailFieldValidator {
static String? validate(String value) {
    return value.isEmpty ? 'Email can\'t be empty' : null;
  }

}

class PasswordFieldValidator {
  static String? validate(String value) {
    return value.isEmpty ? 'Password can\'t be empty' : null;
  }
}

这是给出错误的代码

 List<Widget> buildInputs() {
    return <Widget>[
      TextFormField(
        key: Key('email'),
        decoration: InputDecoration(labelText: 'Email'),
        validator: EmailFieldValidator.validate, //this gives string error mentioned above
        onSaved: (String value) => _email = value, //getting void error mention above 
      ),
      TextFormField(
        key: Key('password'),
        decoration: InputDecoration(labelText: 'Password'),
        obscureText: true,
        validator: PasswordFieldValidator.validate,  // getting string error mentioned above
        onSaved: (String value) => _password = value, //getting void error mention above 
      ),
    ];
  }

您可能 return 一个空值但不允许您在那里使用 null 的问题。

尝试在value之后添加!:

onSaved: (String value) => _email = value!, 
onSaved: (String value) => _password = value!, 

这是Null Safety这个东西扑过来之后面临的问题。我通常只是将它转换为 String 来使用它。有时它会给出错误,但不会给出可能会破坏您的应用程序的错误。

onSaved: (String? value) => _email = value as String,


static String? validate(String? value) {
String valueString = value as String;
// Do Your Usual thing over here like checking if it's empty}

第一个错误

EmailFieldValidator.validatePasswordFieldValidator.validate 都具有相同的类型:String? Function(String)。也就是说,它们都是以非可选 String 作为参数的函数,以及 return 可选 String.

的函数

错误消息告诉您 TextFormFieldvalidator 参数需要类型为 String? Function(String?)? 的函数。也就是说,一个可选函数(也就是说,如果你根本不需要任何验证器功能,你可以传递 null),它本身接受一个可选的 String 参数,而 return 是可选的 String.

注意区别:验证器函数的参数不是可选的,但它们必须是可选的。因此,您需要更改它们的函数签名:

static String? validate(String? /* ⬅️ Notice this is now optional! */ value) { ... }

虽然有人可能会问:为什么不在这里使用 lambda 并推断类型?

第二个错误

错误类似。查看 void Function(T? newValue)docs of TextFormField's constructor, we see that the type of the onSaved parameter is FormFieldSetter<String>, where FormFieldSetter is just a typealias。因此,onSaved 参数的解析类型为 void Function(String? newValue).

您传递的 lambda 函数 (String value) => _password = value 采用非可选 String 参数。注意不匹配。它需要接受一个可选的,因为保存过程可能会产生一个 null 值,你需要处理它。

具体如何处理 null 取决于您,并且取决于您的要求。如果该字段不是必填字段,您可能希望最终将 null 保存在数据库中(例如)。或者您可以替换默认值(尽管在这种情况下这没有意义)。或者你在极端情况下,如果你绝对确定你永远不会得到一个空值,你可以强制解包它。当然,这样做就好像你在对 Dart 说以下内容:

I'm super-duper sure this will never be null. If it is, the sky is falling, and I haven't devised a way to deal with that yet. Things are clearly not working the way I expected. Rather than carrying on forward in this misbehaved state, please just crash my app and prevent further damage

这是否可取,取决于您的问题域。