Поэтапная валидация поля

Есть вот такой класс, который планируется использовать при валидации различных полей:

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
      ),
→ Ссылка