使用方法
- 复制安装命令,在自己的智能体环境安装前先检查源码包。
- 从原始文档核对所需工具、凭据和支持的宿主。
- 说明输入材料与期望交付物,并对照来源检查输出。
npx skills add https://github.com/dhruvanbhalara/skills --skill flutter-bloc-forms开始前需了解
- 安装不包含模型订阅、API 额度或访问文件的权限。
- 仓库星数和安装量反映活跃情况,不等于独立质量或安全测试。
按源仓库内容呈现,保留标题、案例、代码、表格、链接以及原文引用的演示图片。
Form Architecture with BLoC
- Manage form state in a dedicated
FormBloc(not in widgetsetState) - Each form field maps to a property in the BLoC state
- Validate on field change (real-time) or on submit (batch) depending on UX requirements
- Emit
FormSubmitting,FormSuccess,FormErrorstates for submission flow
Form Events
FieldChanged(field, value): update a single field in stateFormSubmitted: trigger validation and submissionFormReset: clear all fields and errors
Form State
- Use a single state class with all field values, field-level errors, and form status:
sealed class FormStatus { initial, submitting, success, failure }- Field errors:
Map<String, String?>keyed by field name (nullmeans valid)
Validation Patterns
- Validate in the domain layer (not in widgets or BLoCs)
- Create pure validator functions that return
String?(null = valid, string = error message):
String? validateEmail(String value) =>
value.contains('@') ? null : 'Invalid email';- Compose validators:
String? validate(String v) => validateRequired(v) ?? validateEmail(v) - Use localized error messages via
context.l10n: no hardcoded validation strings
Input Widgets
- Use
TextFormFieldwithInputDecorationfor consistent styling - Always set
textInputActionfor proper keyboard behavior (next,done) - Always set
keyboardTypematching the field type (emailAddress,phone,number) - Use
inputFormattersto restrict input (e.g.,FilteringTextInputFormatter.digitsOnly) - Assign
Key('feature_fieldName')to every form field for test access - Use
AutofillHintsfor login/signup forms (email, password, name) - Wrap form fields with
FocusorFocusTraversalGroupfor proper tab order
Controller Lifecycle
- Declare
TextEditingControlleraslate finalininitState(): dispose indispose() - Sync controllers to BLoC via
onChangedcallback or controller listener
Form Submission
- Disable submit button while
FormStatus.submittingto prevent double-submission - Show inline field errors below each field (not just a top-level error)
- On success: navigate, show success feedback, and reset form if staying on same page
- On failure: show error feedback via
SnackBaror inline, keep form data intact
Common Form Patterns
- Search: Use
debouncetransformer on search events (300-500ms delay) - Multi-step: Each step is a separate form state within one
FormBloc, validated independently - Dependent fields: Update dependent field options in
on<FieldChanged>handler (e.g., country → city)




