【问题标题】:Form validators in a separate Dart file单独的 Dart 文件中的表单验证器
【发布时间】:2021-10-15 00:15:10
【问题描述】:

我正在考虑在单独的 dart 文件中编写验证器,以便获得更简洁的代码。我确实写了一个新的dart文件并写了一个带有条件的字符串方法但是如何在textformfield的validator参数中初始化dart文件?

TextFormField(
       textCapitalization: TextCapitalization.characters,
       controller: _articleNumberController,
       validator: Validators.validateName(),
       decoration: InputDecoration(
            prefixIcon: Icon(Icons.straighten),
            labelStyle: Theme.of(context).textTheme.subhead,
            labelText: 'Article Number',
            contentPadding: EdgeInsets.all(15.0),
            isDense: true,
            border: OutlineInputBorder(
                   borderRadius: BorderRadius.circular(4.0),
                   ),
                ),
   ),

这是验证器的单独类文件

class Validators {
  String validateName(String value) {
    String pattern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(pattern);
    if (value.length == 0) {
      return "Name is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Name must be a-z and A-Z";
    }
    return null;
  }

}

如果我尝试在 validator 中初始化为 validator: Validators.validateName(),我会收到一个错误为 The argument type 'String' can't be assigned to the parameter type 'String Function(String)'

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为您需要在初始化方法时添加static

    class Validators {
     static String validateName(String value) {
        String pattern = r'(^[a-zA-Z ]*$)';
        RegExp regExp = new RegExp(pattern);
        if (value.length == 0) {
          return "Name is Required";
        } else if (!regExp.hasMatch(value)) {
          return "Name must be a-z and A-Z";
        }
        return null;
      }
    }
    

    然后你的代码看起来像

    TextFormField(
           textCapitalization: TextCapitalization.characters,
           controller: _articleNumberController,
           validator: Validators.validateName,
           decoration: InputDecoration(
                prefixIcon: Icon(Icons.straighten),
                labelStyle: Theme.of(context).textTheme.subhead,
                labelText: 'Article Number',
                contentPadding: EdgeInsets.all(15.0),
                isDense: true,
                border: OutlineInputBorder(
                       borderRadius: BorderRadius.circular(4.0),
                       ),
                    ),
       ),
    

    【讨论】:

    • 我只是要测试这个重写......很高兴你打败了我。当您拥有something: (value) => some.function(value), 时,这通常是一种代码异味,因为something: some.function, 通常是相同的东西,而调用堆栈上没有额外的项目。无需用匿名函数包装命名函数!
    • @RandalSchwartz 是的 :)
    【解决方案2】:

    希望这个方法对你有用

    TextFormField(
     textCapitalization: TextCapitalization.characters,
     controller: _articleNumberController,
     validator: (value) => Validators.validateName(value),
     decoration: InputDecoration(
     prefixIcon: Icon(Icons.straighten),
     labelStyle: Theme.of(context).textTheme.subhead,
     labelText: 'Article Number',
     contentPadding: EdgeInsets.all(15.0),
     isDense: true,
     border: OutlineInputBorder(
        borderRadius: BorderRadius.circular(4.0),
       ),
      ),
    ),
    
    /// class
    
    class Validators {
      static String validateName(String value) {
        String pattern = r'(^[a-zA-Z ]*$)';
        RegExp regExp = new RegExp(pattern);
        if (value.length == 0) {
          return "Name is Required";
        } else if (!regExp.hasMatch(value)) {
          return "Name must be a-z and A-Z";
        }
        return null;
      }
    
    }
    

    【讨论】:

      【解决方案3】:

      试试这个包 https://pub.dev/packages/queen_validators

      import 'package/queen_validators/queen_validators.dart';
      @override
      Widget build(BuildContext context) {
      return TextFormField(
           // use qValidator function and provider list of rules to apply on this field
          validator: qValidator([
            IsRequired(),
            IsEmail(),
            MinLength(8),
            MaxLength(30, "optionally you can override the failure if the validation fails"),
          ]),
        );
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 2019-09-11
        • 1970-01-01
        相关资源
        最近更新 更多