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

时间:2021-07-09 19:48:40

标签: flutter nullable non-nullable flutter-null-safety

class StudentValidationMixin {

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

主体可能正常完成,导致返回 'null',但返回类型可能是不可为 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,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

无法将参数类型“String Function(String)”分配给参数类型“String?函数(字符串?)?'。

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

2 个答案:

答案 0 :(得分:2)

<块引用>

主体可能正常完成,导致返回 'null',但返回类型可能是不可为 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';
  }
}

答案 1 :(得分:0)

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;
  }
}