错误:不能将参数类型“字符串函数(字符串)”分配给参数类型“字符串?函数(字符串?)?

class StudentValidationMixin {

    String validateFirstName(String value) {
      if(value.length<2){
        return 'İsim en az iki karakter olmalıdır';
    }
  }
}

主体可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型。

class _StudentAddState extends State with StudentValidationMixin {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Yeni öğrenci ekle"),
      ),
      body: Container(
        margin: EdgeInsets.all(20.0),
        child: Form(
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: "Öğrenci Adı", hintText: "Fatih"),
                validator: validateFirstName,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

参数类型“字符串函数(字符串)”不能分配给参数类型“字符串?函数(字符串?)?'。

这两个单独的代码位出现错误。我应该怎么办?

stack overflow Error: The argument type 'String Function(String)' can't be assigned to the parameter type 'String? Function(String?)?'
原文答案
author avatar

接受的答案

主体可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型。

当您在函数/方法中不返回任何内容时,它会隐式返回 null,因此

String validateFirstName(String value) {
  if(value.length<2){
    return 'İsim en az iki karakter olmalıdır';
  }
}

相当于这个

String validateFirstName(String value) {
  if(value.length<2){
    return 'İsim en az iki karakter olmalıdır';
  }
  return null;
}

但是这个方法的返回类型是 String ,一个不可为空的类型。要使其可以为空(因为您返回 null),请在其后添加一个问号:

//    v
String? validateFirstName(String value) {
  if(value.length<2){
    return 'İsim en az iki karakter olmalıdır';
  }
}

参数类型'String Function(String)' 不能分配给参数类型'String?函数(字符串?)?'。

validatorTextFormField 参数是一个接收可空类型并返回可空类型的函数(即 String? Function(String?) ,因此只需在 value 参数后添加问号即可:

//                              v
String? validateFirstName(String? value) {
  if (value == null) {
    // The user haven't typed anything
    return "Type something, man!";
  }
  if (value.length<2){
    return 'İsim en az iki karakter olmalıdır';
  }
}

答案:

作者头像

TextFormField 验证器接受返回字符串的函数?带参数字符串?所以重构你的代码,如下所示。

class StudentValidationMixin {

  String? validateFirstName(String? value) {
    if(value == null)
      return "İsim boş olamaz!";

     if(value.length<2){
      return 'İsim en az iki karakter olmalıdır';
    }
    return null;
  }
}
作者头像
TextFormField(
       validator: (value) {
       controller.isNumberValid(value);

因此,对于 TextFormField 的验证器之类的东西,您需要以这种方式处理它以避免该错误。

作者头像

我已经在 Flutter Form validation with null safety 上回答了这个问题

但是我仍然会给出快速参考的提示(从链接中阅读完整示例)

String? validatePassword(String? value) {
  if(value!.length < 6){
    return 'Invalid password, length must be more than 6';
  }

}

编辑文本是我为个人使用而创建的自定义文本字段

EditText(hintText:"Email",fontSize: 12.sp,paddingLeft: 8,marginLeft:  10.h,marginRight: 10.h,
                        textController: controller.emailController,validator: validateEmail,),

相关问题