【问题标题】:Error: The argument type 'String Function(String)' can't be assigned to the parameter type 'String? Function(String?)?'错误:不能将参数类型“字符串函数(字符串)”分配给参数类型“字符串?函数(字符串?)?
【发布时间】:2021-09-20 03:02:24
【问题描述】:
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,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

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

【问题讨论】:

    标签: flutter dart-null-safety


    【解决方案1】:

    主体可能正常完成,导致返回“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?函数(字符串?)?'。

    TextFormFieldvalidator参数是一个接收可空类型并返回可空类型的函数(即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';
      }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        TextFormField(
               validator: (value) {
               controller.isNumberValid(value);
        

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

        【讨论】:

          猜你喜欢
          • 2022-01-21
          • 2021-10-28
          • 2021-12-20
          • 2021-10-21
          • 2021-10-13
          • 2021-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多