Повторное использование валидатора ввода - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь создать logi c для одновременного повторного использования нескольких валидаторов ввода. Вот код DartPad

void main() {

  String value = 'pppppp';

  print(InputValidator([InputValidator.minCharacters(value, 2),
                        InputValidator.maxCharacters(value, 5)
                        ]).validate().toString());
}

class InputValidator {
  final List<String> validators;

  InputValidator(this.validators);

  List<String> validate() {
    List<String> result = [];
    validators.where((s) => s != null).forEach(result.add);
    return result;
  }

  static String maxCharacters(String value, int limit) {
    if (value.length > limit) {
      return 'Max $limit characters allowed';
    }
    return null;
  }

  static String minCharacters(String value, int limit) {
    if (value.length < limit) {
      return 'Min $limit characters required';
    }
    return null;
  }
}

logi c отлично работает, однако я пытаюсь сделать его еще проще, когда мне не нужно передавать значение в каждый метод. Я хочу сделать параметр значения в классе InputValidator и принимать это значение при запуске метода. Проблема в том, что каждый метод имеет статус c, поэтому я не могу использовать этот параметр в методе .. Есть ли другой способ?

Вот как я хотел бы его использовать

validator: InputValidator(value, [InputValidator.minCharacters(2),
                                 InputValidator.maxCharacters(5)
                                 ]).validate()

1 Ответ

2 голосов
/ 18 июня 2020

Еще раз спасибо @pskink, где он указал на FormFieldValidator. При этом очень просто повторно использовать проверку TextFormField.

Вот класс валидатора

    FormFieldValidator<String> all(Iterable validators) {
  return (String s) {
    var error = validators
      .map((v) => v(s))
      .where((error) => error != null)
      .join(' AND ');
    return error.isEmpty? null : error;
  };
}

 FormFieldValidator<String>  uppercase() {
  return (String s) => s.startsWith(RegExp('[A-Z]'))? null : 'does not start with uppercase' ;
}

 FormFieldValidator<String>  limit(min, max) {
  return (String s) => (min <= s.length && s.length <= max)? null : 'length not in range [$min..$max]';
}

и как его использовать

Column(
      children: [
        Form(key: _formKey, child: TextFormField(validator:all([limit(2,5), uppercase()]))),

        FlatButton(child:Text('Validate'), onPressed: (){if(_formKey.currentState.validate()) 
         {print('OK');}}),
      ],
    );
...