Saltar al contenido principal

Validadores

Clases

Nombrado de validadores y errores de validación

A. Nombrado de Validadores

Los validadores deben iniciar con el nombre del campo a validar seguido de sufijo Field.

class EmailField {} //Nombrado para validación de campo Email

class PasswordField {} //Nombrado para validación de campo Password

B. Nombrado de Errores de Validación

Las clases utilizadas para representar los errores de validación deben iniciar con el nombre del campo a validar seguido de sufijo ValidationFailure.

class EmailValidationFailure {} //Nombrado para el error de validación de el campo Email

class PasswordValidationFailure {} //Nombrado para el error de validación de el campo Password

Extensión de FormField

Los validadores deben extender de la superclase FormField<T, E extends FieldValidationFailure>.

class EmailField extends FormField<String, EmailValidationFailure>

class PasswordField extends FormField<String, PasswordValidationFailure>

class PriceField extends FormField<double, PriceValidationFailure>

Extensión de FieldValidationFailure

Los errores de validación deben extender de la clase FieldValidationFailure. Se debe establecer una jerarquía de clases donde se declare una sealed class para definir una clase base de todos los errores de validación.

//Sealed class que engloba todos los errores de validación para el campo Password
sealed class PasswordValidationFailure extends FieldValidationFailure {}

//Enum class que representa los posibles errores "generales" del campo Password
enum BasicPasswordValidationFailure implements PasswordValidationFailure {
empty,
format,
containsUppercase
}

//Clase que representa un error específico
class MinLengthPasswordValidationFailure extends PasswordValidationFailure {
final int minLength;

MinLengthPasswordError({required this.minLength});
}

Constructores

Las clases que extiendad de FormField deben implementar 2 constructores nombrados, estos representan el estado del campo a validar.

Constructor Pure.

Representa el estado inicial de un campo sin modificaciones del usuario. Este constructor se debe utilizar para dar una instancia inicial del campo a validar.

El constructor por defecto se implementa con un parámetro obligatorio pero en caso de ser necesario puede implementarse con un parámetro opcional.

class EmailField extends FormField<String, EmailValidationFailure> {

const EmailField.pure(super.value) : super.pure(); //Constructor Pure con un parámetro obligatorio

const EmailField.pure([String? initialValue])
: super.pure(initialValue ?? ''); //Constructor Pure con un parámetro opcional
}

Constructor Dirty.

Representa el estado de un campo ya modificado por el usuario. Este constructor se debe utilizar al momento de realizar modificaciones sobre el campo.

El constructor por defecto se implementa con un parámetro obligatorio y no se pueden realizar modificaciones sobre el constructor para convertir este parámetro en opcional.

class EmailField extends FormField<String, EmailValidationFailure> {

const EmailField.dirty(super.value) : super.dirty(); //Constructor Dirty con un parámetro obligatorio
}

Métodos

Método Validator.

La clase FormField obliga a todas las clases que extiendad de ella a implementar un método E? validator(T value). En este método se deben realizar las validaciones necesarias, cada validación debe retornar un objeto de tipo E. Si todas las validaciones se cumplen correctamente se debe retornar null.

class EmailField extends FormField<String, EmailValidationFailure> {


EmailError? validator(String value) {
//Valida si el campo se encuentra vacío.
if (value.isEmpty) return EmailError.empty; //En caso de estar vacío retornar un error.
//Valida si el formato cumple con las características de un email.
if (!_emailRegExp.hasMatch(value)) return EmailError.isNotEmail; //En caso de no cumplir con el formato retorna un error.
//Si todas las validaciones se cumplen retorna null representando que el campo se encuentra correctamente validado.
return null;
}
}