BSD-3 License Website Connect with Acme Software on Linkedin Twitter Follow Facebook Instagram

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'),
      ),
    ],
  ),
),

Libraries

uniform