Поэтапная валидация поля
Есть вот такой класс, который планируется использовать при валидации различных полей:
class InputValidator {
InputValidator({this.error = ''});
final String error;
String email(value) {
final globalValidator = GlobalValidator();
bool result = globalValidator.email(value);
String err = error != '' ? error : "This is not email";
return result ? null : err;
}
String require(value) {
String err = error != '' ? error : "This field is required";
return value != '' ? null : err;
}
String stepByStep(value) {
return 'xxx';
}
}
Пример использования
Input(
label: "Email",
type: 'email',
controller: emailController,
validator: inputValidator.stepByStep
),
Столкнулся с вопросом поэтапной валидации поля. Имеется ввиду, несколько различных валидаций одного поля с разными ошибками. Например, сначала определяю на require, а потом на соответствие паттерну email'a.
Планировал создать в этом же классе метод stepByStep, в в котором бы и происходила необходимая магия. Но вот как это правильно сделать в Dart - не знаю.
На JS я бы сделал это условно так:
function stepByStep(value, steps){
stepsName.forEach(stepName => {
this[stepName](value);
})
}
stepByStep('xxx', ['require', 'email']);
Ответы (2 шт):
Автор решения: MiT
→ Ссылка
Я вижу только такое решение (Если не хотите использовать enum, то можно сделать также на строках):
enum InputSteps { require, email }
class InputValidator {
InputValidator({this.error = ''});
final String error;
String _email(value) {
final globalValidator = GlobalValidator();
bool result = globalValidator.email(value);
String err = error != '' ? error : "This is not email";
return result ? null : err;
}
String _require(value) {
String err = error != '' ? error : "This field is required";
return value != '' ? null : err;
}
String stepByStep(value, InputSteps steps) {
switch (steps) {
case InputSteps.require:
return _email(value);
case InputSteps.email:
return _require(value);
}
}
}
Автор решения: Дмытрык
→ Ссылка
Сделал так:
class InputValidator {
InputValidator({this.error = '', this.steps});
final String error;
final List<Function> steps;
String email(value) {
final globalValidator = GlobalValidator();
bool result = globalValidator.email(value);
String err = error != '' ? error : "This is not email";
return result ? null : err;
}
String require(value) {
String err = error != '' ? error : "This field is required";
return value != '' ? null : err;
}
String stepByStep(value) {
for (var element in steps) {
final check = element(value);
// здесь провести необходимые действия при том или ином результате последовательной валидации
}
return 'xxx';
}
}
Использование:
final inputValidator = InputValidator(steps: [InputValidator().require, InputValidator().email]);
Input(
label: "Email",
type: 'email',
controller: emailController,
validator: inputValidator.stepByStep
),