The Flutter package binds a KeyedFormController to widgets; it does not replace the shared schema or controller. Start with
form scope and context, choose a field binding
or text binding, then use selective rebuilds,
virtualized lists, and submit/error reveal
as needed. Schema definitions and pure-Dart state remain usable without Flutter.
KeyedForm<LoginSchema>(
controller: form,
child: KeyedFormField.text<LoginSchema>(
field: LoginFields.email,
builder: (context, field, text) => TextField(
controller: text,
decoration: InputDecoration(errorText: field.errorText),
),
),
)
See installation and quickstart. For variant-specific controls, see rendering union fields.