fromConfig static method
Creates a validator function from Form.io validation config.
Parses the component's validate object and returns a combined validator. For cross-field validation, pass the form data context.
Example validate config:
{
"required": true,
"minLength": 3,
"maxLength": 50,
"pattern": "^[A-Za-z]+$"
}
Implementation
static String? Function(String?)? fromConfig(
Map<String, dynamic>? validateConfig,
String fieldName, {
Map<String, dynamic>? formData,
}) {
if (validateConfig == null || validateConfig.isEmpty) {
return null;
}
return (String? value) {
final validators = <String? Function()>[];
// Required
if (validateConfig['required'] == true || validateConfig['required'] == 'true') {
validators.add(() => required(value, fieldName: fieldName));
}
// String length
if (validateConfig['minLength'] != null) {
final min = validateConfig['minLength'] is int ? validateConfig['minLength'] as int : int.tryParse(validateConfig['minLength'].toString()) ?? 0;
if (min > 0) {
validators.add(() => minLength(value, min, fieldName: fieldName));
}
}
if (validateConfig['maxLength'] != null) {
final max = validateConfig['maxLength'] is int ? validateConfig['maxLength'] as int : int.tryParse(validateConfig['maxLength'].toString()) ?? 0;
if (max > 0) {
validators.add(() => maxLength(value, max, fieldName: fieldName));
}
}
// Word count
if (validateConfig['minWords'] != null) {
final min = validateConfig['minWords'] is int ? validateConfig['minWords'] as int : int.tryParse(validateConfig['minWords'].toString()) ?? 0;
if (min > 0) {
validators.add(() => minWords(value, min, fieldName: fieldName));
}
}
if (validateConfig['maxWords'] != null) {
final max = validateConfig['maxWords'] is int ? validateConfig['maxWords'] as int : int.tryParse(validateConfig['maxWords'].toString()) ?? 0;
if (max > 0) {
validators.add(() => maxWords(value, max, fieldName: fieldName));
}
}
// Pattern
if (validateConfig['pattern'] != null) {
final patternStr = validateConfig['pattern'].toString();
if (patternStr.isNotEmpty) {
validators.add(() => pattern(value, patternStr));
}
}
// Cross-field validation - matchField
if (validateConfig['matchField'] != null && formData != null) {
final matchFieldKey = validateConfig['matchField'].toString();
validators.add(() => matchField(
value,
formData[matchFieldKey],
fieldName,
matchFieldKey,
));
}
return combine(validators);
};
}