
Начало работы с FForm 🌟
Прежде всего, давайте добавим пакет FForm в ваш проект Flutter. Добавьте FForm в файл pubspec.yaml в разделе зависимостей:
Не забудьте запустить flutter pub get в вашем терминале, чтобы установить пакет.
Обзор
FForm — это высокоуровневый пакет Flutter, разработанный для упрощения создания и управления формами с упрощенной валидацией полей. Он предлагает два основных компонента: FFormField и FFormBuilder, которые вместе приносят легкость и гибкость в обработку форм в приложениях Flutter.
FFormField<T, E>: Базовый класс для всех полей формы, поддерживающий значения, валидацию на лету и обработку изменений.FFormBuilder<F extends FForm>: Виджет, который конструирует и управляет состоянием формы, используя потоки для динамического обновления интерфейса по мере изменения данных.FForm: Базовый класс для создания пользовательских классов форм, позволяющий добавлять конкретные методы и свойства в ваши формы.FFormException: Базовый класс для создания пользовательских исключений для полей формы, позволяющий определять пользовательские правила валидации и сообщения об ошибках.FFormProvider: Виджет, который позволяет получить доступ к форме в дереве виджетов без передачи ее в качестве параметра.
Почему это круто 🎸
Упрощенное управление состоянием: Автоматически обрабатывает состояние как отдельных полей формы, так и формы в целом.
Встроенная валидация с изюминкой: Поддерживает валидацию на лету и обработку ошибок для каждого поля, обеспечивая плавный пользовательский опыт.
Максимальная гибкость: Поддерживает любой тип данных для значений полей и ошибок валидации благодаря дженерикам.
Реактивные формы для победы: Использует потоки для отслеживания изменений состояния формы, обеспечивая синхронизацию вашего интерфейса.
Множество форм? Нет проблем: Создавайте несколько форм с пользовательскими полями и правилами валидации, все это управляется FForm.
Пользовательские исключения для особых нужд: Определяйте пользовательские исключения для полей формы, чтобы с легкостью обрабатывать сложные правила валидации и сообщения об ошибках.
Примеры использования
FFormField
FFormField — базовый класс для всех полей формы, поддерживающий значения, валидацию на лету и обработку изменений. Он предоставляет набор геттеров и методов для управления состоянием поля, включая проверку валидности поля, получение текущего значения и обработку исключений.
Пример
enum EmailError { empty, not; @override String toString() { switch (this) { case empty: return 'emailEmpty'; case not: return 'invalidFormatEmail'; default: return 'invalidFormatEmail'; } } } class EmailField extends FFormField<String, EmailError> { EmailField({required String value}) : super(value); @override EmailError? validator(value) { if (value.isEmpty) return EmailError.empty; return null; } }
FForm
FForm — базовый класс для создания пользовательских классов форм с конкретными полями и правилами валидации. Он предоставляет набор геттеров и методов для управления состоянием формы, включая проверку валидности формы, получение ответов и обработку исключений.
Пример
Это простой пример того, как создать форму с одним полем. Вы можете расширить класс FForm, чтобы создать пользовательские формы с конкретными полями и правилами валидации.
class LoginForm extends FForm { EmailField email; LoginForm({ required this.email, }); @override List<FFormField> get fields => [email]; }
Это более сложный пример того, как создать форму с несколькими полями. Вы можете расширить класс FForm, чтобы создать пользовательские формы с конкретными полями и правилами валидации.
class Form extends FForm { List<Form> forms; Form({ required this.forms, }); @override List<FFormField> get subForms => forms; }
allFieldUpdateCheck — это свойство в FForm, которое определяет, приводит ли каждое обновление поля к перестройке FFormBuilder. Когда установлено в true, форма будет перестраиваться при каждом обновлении поля, обеспечивая мгновенную обратную связь для пользователя. Когда установлено в false, форма будет перестраиваться только при вызове геттеров isValid или isInvalid, уменьшая количество перестроек и повышая производительность.
class LoginForm extends FForm { EmailField email; LoginForm({ required this.email, }); @override bool get allFieldUpdateCheck => true; @override List<FFormField> get fields => [email]; }
FFormBuilder
FFormBuilder — это виджет, который конструирует и управляет состоянием формы, используя потоки для динамического обновления интерфейса по мере изменения данных. Он предоставляет функцию построения, которая принимает форму и возвращает дерево виджетов на основе состояния формы.
Пример
Это пример того, как использовать FFormBuilder для создания формы с одним полем. Функция построения принимает форму в качестве параметра и возвращает дерево виджетов на основе состояния формы.
void _submit() { if(_form.isValid) { // .isValid или .isInvalid запускают перестройку в FFormBuilder и возвращают boolean print('Форма валидна'); }; } @override Widget build(BuildContext context) { return FFormBuilder<LoginForm>( form: _form, builder: (context, form) { EmailField email = form.email; // или FFormProvider.of<LoginForm>(context).get<NameField>() return Column( children: [ TextField( key: email.key, controller: _emailController, decoration: InputDecoration( labelText: 'Email', errorText: email.exception.toString(), ), ), ElevatedButton( onPressed: _submit, child: const Text('Отправить'), ), ], ); }, ); }
FFormProvider
FFormProvider — это виджет, который позволяет получить доступ к форме в дереве виджетов без передачи ее в качестве параметра.
Пример
FFormBuilder<LoginForm>( form: _form, builder: (context, form) { FFormProvider.of<LoginForm>(context).email; // или form.email; FFormProvider.of<LoginForm>(context).get<NameField>(); // или form.get<NameField>(); return YourForm(); }, )
FFormException
FFormException — базовый класс для создания пользовательских исключений для полей формы. Он позволяет определять пользовательские правила валидации и сообщения об ошибках для полей формы, позволяя с легкостью обрабатывать сложные сценарии валидации.
Пример
Вы можете создать пользовательский класс исключения, который расширяет FFormException, чтобы определить конкретные правила валидации и сообщения об ошибках для поля формы.
class PasswordValidationException extends FFormException { final bool isMinLengthValid; final bool isSpecialCharValid; final bool isNumberValid; PasswordValidationException({ required this.isMinLengthValid, required this.isSpecialCharValid, required this.isNumberValid, }); @override bool get isValid => isMinLengthValid && isSpecialCharValid && isNumberValid; } class PasswordField extends FFormField<String, PasswordValidationException> { PasswordField(String value) : super(value); @override PasswordValidationException? validator(String value) { final validator = FFormValidator(value); return PasswordValidationException( isMinLengthValid: validator.isMinLength(8), isSpecialCharValid: validator.isHaveSpecialChar, isNumberValid: validator.isHaveNumber, ); } }
Не стесняйтесь внести свой вклад в пакет или сообщить о любых проблемах в репозитории GitHub. Приятного кодирования!

Пример показывает дефолтную реализации формачки, буквально каждый реализовывал такую реализацию
Был использован:
class LoginForm extends FForm
class EmailField extends FFormField
class PasswordField extends FFormField

Показан пример со сложной валидацией поля, как в примере это пароль с проверкой на
- Максимальное количество символов
- Обязательно специфичные цифры
- Обязательно цифры
Был Использован:
class PasswordValidationException extends FFormException
class PasswordField extends FFormField<string, PasswordValidationException>
class PasswordForm extends FForm

На примере показана, форма которая включает в себя другие формы, что дать гибкость в создание сложных систем валидации на уровне клиента.
Тут был DrawForm который включает в себе List<DrawForm>

Простая форма, которая включает в себе массив других форм.
Если заметить, то поле сверху автоматически проверяется в случае какого либо изменения. За это как раз таки отвечает поле bool allFieldUpdateCheck которое можно перезаписать в случае вашего кейса. Это используется для определения необходимости перестраивать форму при каждом обновлении поля.
Ссылка на пакет fform, github repository, блог в котором можно отследить изменения и дополнения этого пакета
