uniform 2.0.4 uniform: ^2.0.4 copied to clipboard
A lightweight form library for Flutter that handles form validation and state management gracefully, with unified form representation.
A form library for Flutter that handles form validation and state management gracefully,
with unified form representation.
Uniform handles the repetitive and annoying stuff—keeping track of values/errors/visited fields, orchestrating validation, and handling submission.
Features #
- 🪶 Lightweight & extensive.
- 🎮 Unified form representation using controllers.
- 🔄 Easy and customizable form validation API.
- 🔧 Built-in support for form submission and state management.
- 🛠️ Builders for quickly creating form fields.
- 🚀 Compatible with any state management solution or vanilla Flutter States.
- 🔒 Supports for global and local validators.
Getting started #
See the Installing section. No extra configurations needed.
Usage #
Note: Detailed Usage documentation is coming soon. For now, please refer to the example for more details.
final formController = FormController(
validators: {const InputFieldValidator.required()},
);
TextFieldController.create(formController, tag: 'email')
..setValidators({const EmailInputFieldValidator()});
FieldController<bool>.create(formController, tag: 'remember_me', autoValidate: true)
..setInitialValue(false)
..setValidators({const PasswordInputFieldValidator()});
InputForm(
controller: formController,
child: Column(
children: [
TextInputFieldBuilder(
tag: 'email',
builder: (_, controller, textController) {
return TextFormField(
controller: textController,
decoration: InputDecoration(
hintText: 'Email Address',
errorText: controller.error.message,
),
enabled: !controller.isSubmitted,
onChanged: controller.onChanged,
);
},
),
const SizedBox(height: 16),
InputFieldBuilder<bool>(
tag: 'remember_me',
builder: (context, controller, _) {
return CheckboxListTile(
title: const Text('Remember Me'),
value: controller.value,
controlAffinity: ListTileControlAffinity.leading,
enabled: !controller.isSubmitted,
onChanged: controller.onChanged,
);
},
),
const SizedBox(height: 40),
FilledButton(
onPressed: () {
if(formController.validate()){
print('Form Submitted!');
}
},
child: const Text('Submit'),
),
],
),
),