Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/zakariaf/flutter-skills/forms-and-inputnpx skills add zakariaf/Flutter-Skills --skill forms-and-inputgit clone --depth 1 https://github.com/zakariaf/Flutter-SkillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/zakariaf/flutter-skills/forms-and-input)<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/forms-and-input"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/forms-and-input.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00203 | $0.02795 |
| Opus 5 | $0.00102 | $0.01398 |
| Sonnet 5 | $0.00041 | $0.00559 |
| Haiku 4.5 | $0.00020 | $0.00280 |
Grade A, and why
forms-and-input scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 6d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 188 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Forms and input
Text input is where most disposal leaks, un-localized strings, and jank enter a Flutter app. A form is a small state machine: fields hold text, a FormState validates them, and a ViewModel owns anything that touches the network or the clock. Keep those three responsibilities separate.
Read the reference for the task at hand:
references/validation-sync-and-async.md— syncvalidatorreturning localizedString?,AutovalidateModechoice, and the debounced-async-in-a-Notifier pattern (why async must NOT live in the sync validator).references/focus-and-keyboard.md—FocusNodelifecycle, traversal order,autofocus,FocusTraversalGroup,TextInputAction,onFieldSubmitted/onEditingComplete,keyboardType,autofillHints,TextInputFormatter, keyboard-avoidance.
Run scripts/check_forms.sh before a PR.
Non-negotiable rules
- Every
TextEditingControllerandFocusNodecreated in aStateis disposed indispose(). They hold native resources and listeners; a leak survives the widget and fires callbacks against a dead tree. If the value must outlive the widget, hold it in a Notifier instead — seestate-management-riverpod. - Validator messages are localized, never hardcoded. A
validatorreturnsAppLocalizations.of(context).fieldRequired, not'Required'. Error text is user-facing UI copy and is owned byi18n-rtl-l10n. Thecheck_forms.shgrep fails on string literals returned from a validator. - The sync
validatoris pure and instant — noawait, no network, noFuture.FormFieldValidator<T>isString? Function(T?); it cannot be async and Flutter calls it synchronously during layout. Availability/uniqueness checks belong in a Notifier (rule 4). - Async validation lives in a debounced Riverpod Notifier and surfaces through state. Debounce with a
dart:asyncTimer(kept deterministic in tests viafakeAsync, not by the clock), run the check, and exposeAsyncValue/a sealed status the field reads viaInputDecoration.errorText. Any timestamp the check records comes fromref.read(clockProvider).now(), neverDateTime.now()— the Clock seam is owned byservice-boundary-and-native. Never block a keystroke on I/O. Seeasync-safetyfor cancel-on-dispose. - Submit-enabled is DERIVED from validity, never stored as a separate
bool. A stored_isValidflag drifts out of sync with the fields. Compute it fromFormState/Notifier state at build time. Seeflutter-performance(derive-don't-store). - A keystroke rebuilds one field, not the whole form. Give each field its own controller/
FormField; do not lift raw text into a top-levelsetState/watchthat rebuilds every sibling. Scope rebuilds with small widgets andref.watch(....select(...)). Seewidget-compositionandflutter-performance. - Choose
AutovalidateModedeliberately. Default toAutovalidateMode.onUserInteraction: silent until the user touches a field, then live. Neveralways(screams before the user types). Validate-on-submit only for short forms where per-field feedback is noise. - Keyboard type, capitalization, and autofill are declared per field.
keyboardType,textCapitalization,autofillHints, andTextInputFormatters are structural input contracts, not decoration. A missingautofillHintsbreaks OS autofill and password managers. - Errors are announced, not just colored.
InputDecoration.labelText/errorTextcarry semantics that screen readers read on change; never signal an error with color alone. Seeaccessibility-as-code.
What ships with it
5 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 6d ago First seen · 188 lines · 203 tokens per session scan A 2792cc29083e
forms-and-input is a skill published in the GitHub repository zakariaf/Flutter-Skills (2 stars, last pushed 8d ago), licensed MIT. It adds 203 tokens to every session and 2,795 once invoked, about $0.0010 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
frontend-design-saas
S-tier SaaS dashboard and product UI reference. Use this skill when building application shells, data tables, settings panels, billing pages, dashboards, auth flows, admin tools, or any internal/customer-facing SaaS product UI. Inspired by Stripe, Linear, Vercel, Airbnb, Notion. Covers neutral-led design tokens…
frontend-design
Produce intentional, responsive, accessible UI work and perform visual QA instead of generic component assembly.
angular-tooling
Angular CLI usage, code generation, build configuration, and bundle optimization. Use for Angular CLI/build tasks; defer standalone webpack configuration and generic test-runner setup.
angular-http-client
Integrate HttpClient, Interceptors, and API interactions in Angular. Use when integrating HttpClient, writing interceptors, or handling API calls in Angular.
common-accessibility
Enforce WCAG 2.2 AA compliance with semantic HTML, ARIA roles, keyboard navigation, and color contrast standards for web UIs. Use when building interactive components, adding form labels, fixing focus traps, or auditing a11y compliance.
common-ui-design
Design distinctive, production-grade frontend UI with bold aesthetic choices. Use when building web components, pages, interfaces, dashboards, or applications in any framework (React, Next.js, Angular, Vue, HTML/CSS).