formx 0.10.2 formx: ^0.10.2 copied to clipboard
Access, build, validate, sanitize and fill forms easily with Formx.
Formx #
Acessing the state #
BuildContext.formx([String? key])
automatically retrieves the appropriate FormState
for you, though you can specify a key if necessary.
final state = context.formx();
final addressState = context.formx('address');
final email = context.field('email').value;
Alternatively, use
Formx.of(context)
for a traditional approach without visitors, which also rebuilds the widget on form state changes, similar toForm.of(context)
.
FormState extensions #
.value<T>(String key)
, gets the [FormFieldState.value] of a specific field..values
, a structuredMap
with all the values of the form..initialValues
, a structuredMap
with all the initial values of the form..hasInteractedByUser
, whether any nested [FormFieldState.hasInteractedByUser]..hasError
, whether any nested [FormFieldState.hasError]..isValid
, whether all nested [FormFieldState.isValid]..errorTexts
, a flatMap
with all nested [FormFieldState.errorText].operator [key]
, operator to get a specific [FormFieldState] by it's key value.operator [key] = value
, operator to set any nested form/field value(s) directly.
FormxState extension type #
FormxState
is an inline-class that redeclares some of the FormState
methods:
.validate([List<String>? keys])
.save([List<String>? keys])
.reset([List<String>? keys])
These methods function identically to their original counterparts but extend their effects to nested forms. Using FormState.validate
only validates the top-level form, whereas FormxState.validate
also validates any nested forms.
You have the option to specify a list of keys
with these methods to target specific forms or fields for validation, saving, or resetting.
You can redeclare any FormState
to a FormxState
by using FormxState(formState)
type extension.
FormFieldState extensions #
.setErrorText(String? errorText)
, sets the field errorText programmatically. RequiresValidator
.
Validator class #
Ever wish to build validators more declaratively? Validator
is a class that allows you to define your validation rules in a more readable way.
TextFormField(
validator: Validator<String>(
isRequired: true,
test: (value) => value.isEmail,
),
),
You can also use it with modifiers:
TextFormField(
validator: Validator().required().email(),
),
You can set a default requiredText
/invalidText
for all validators:
Validator.defaultRequiredText = 'This field is required';
Validator.defaultInvalidText = 'This field is invalid';
// You can also modify the errorText of a validator:
Validator.modifier = (validator, errorText) => errorText; // good for translations
// And disable them all:
Validator.disableOnDebug = true; // only works on debug mode
Modifiers #
.test(bool Function(T value) test)
.number(bool Function(num value) test)
.datetime(bool Function(DateTime value) test)
.required
.email
.url
.phone
.creditCard
.cpf
.cnpj
.date
.alpha
.numeric
.alphaNumeric
.hasAlpha
.hasNumeric
.hasAlphanumeric
.hasUppercase
.hasLowercase
.hasSpecialCharacter
.minLength(int length)
.maxLength(int length)
.minWords(int words)
.maxWords(int words)
.minNumber(num number)
.maxNumber(num number)
.isAfter(DateTime date)
.isBefore(DateTime date)
Validators, Sanitizers & Helpers extensions #
Formx comes bundled with a set of built-in validators and sanitizers, which you can use to validate and sanitize your form fields.
String
#
.isEmail
.isPhone
.isUrl
.isDate
.isCreditCard
.isCpf
.isCnpj
.isNumeric
.isAlpha
.isAlphaNumeric
.onlyNumeric
.onlyAlpha
.onlyAlphaNumeric
.hasAlpha
.hasNumeric
.hasAlphanumeric
.hasUppercase
.hasLowercase
.hasSpecialCharacters
.equalsIgnoreCase(String)
Map
#
.indented
for a map view that indents when printed..indentedText
for getting an indented text..deepMap
for mapping nested maps..clean
for values that arenull
or empty string/iterable/map.
Deeply recases all your map keys:
.camelCase
"camelCase".constantCase
"CONSTANT_CASE".sentenceCase
"Sentence case".snakeCase
"snake_case".dotCase
"dot.case".paramCase
"param-case".pathCase
"path/case".pascalCase
"PascalCase".headerCase
"Header-Case".titleCase
"Title Case"
List<Widget>
#
.keepAlive
usually needed for building forms with [PageView.children]..expanded
usually needed for building forms with [Column.children] or [Row.children].
Contributing #
Contributions to formx are welcome! Whether it's bug reports, feature requests, or pull requests, all "forms" of collaboration can help make formx better for everyone.