mcpField
F
flutter-bloc-forms

flutter-bloc-forms

github.com/dhruvanbhalara开发30147 次安装8 周前更新
代码仓库

关于 flutter-bloc-forms

使用 BLoC 构建 Flutter 表单的指南,说明表单状态、校验、输入行为、提交流程,以及搜索和多步骤表单等常见模式。

主要功能

  1. 01使用专用 FormBloc 管理状态
  2. 02字段级校验与错误
  3. 03本地化校验消息
  4. 04输入与控制器生命周期指导
  5. 05提交状态与反馈
  6. 06搜索和多步骤表单模式

适用场景

  1. 01构建带校验的注册表单
  2. 02提交失败时保留输入内容
  3. 03实现防抖表单搜索
  4. 04创建多步骤数据录入

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dhruvanbhalara/skills --skill flutter-bloc-forms

安装后在 Claude Code 中输入/flutter-bloc-forms确认已加载。

详细介绍

使用 BLoC 构建表单架构

  • 在专用的 FormBloc 中管理表单状态(而不是在 widget 的 setState 中)
  • 每个表单字段都对应 BLoC 状态中的一个属性
  • 根据 UX 需求,在字段变化时(实时)或提交时(批量)进行验证
  • 在提交流程中发出 FormSubmitting、FormSuccess、FormError 状态

表单事件

  • FieldChanged(field, value):更新状态中的单个字段
  • FormSubmitted:触发验证和提交
  • FormReset:清除所有字段和错误

表单状态

  • 使用一个包含所有字段值、字段级错误和表单状态的状态类:
    sealed class FormStatus { initial, submitting, success, failure }
    
  • 字段错误:使用以字段名为键的 Map<String, String?>(null 表示有效)

验证模式

  • 在领域层进行验证(不要在 widget 或 BLoC 中验证)
  • 创建返回 String? 的纯验证函数(null = 有效,字符串 = 错误消息):
    String? validateEmail(String value) =>
      value.contains('@') ? null : 'Invalid email';
    
  • 组合验证器:String? validate(String v) => validateRequired(v) ?? validateEmail(v)
  • 使用 context.l10n 提供本地化错误消息:不要硬编码验证文案

输入控件

  • 使用 TextFormField 和 InputDecoration,确保样式一致
  • 始终设置 textInputAction,确保键盘行为正确(next、done)
  • 始终设置与字段类型匹配的 keyboardType(emailAddress、phone、number)
  • 使用 inputFormatters 限制输入(例如,FilteringTextInputFormatter.digitsOnly)
  • 为每个表单字段分配 Key('feature_fieldName'),以便在测试中访问
  • 在登录/注册表单中使用 AutofillHints(email、password、name)
  • 使用 Focus 或 FocusTraversalGroup 包裹表单字段,确保 Tab 顺序正确

控制器生命周期

  • 在 initState() 中将 TextEditingController 声明为 late final,并在 dispose() 中释放
  • 通过 onChanged 回调或控制器监听器将控制器状态同步到 BLoC

表单提交

  • 当 FormStatus.submitting 时禁用提交按钮,防止重复提交
  • 在每个字段下方显示内联字段错误(不要只显示在顶层)
  • 成功时:导航、显示成功反馈;如果仍停留在同一页面,则重置表单
  • 失败时:通过 SnackBar 或内联方式显示错误反馈,并保留表单数据

常见表单模式

  • 搜索:在搜索事件上使用 debounce 转换器(延迟 300-500ms)
  • 多步骤:每个步骤都是同一个 FormBloc 中独立的表单状态,并单独验证
  • 依赖字段:在 on<FieldChanged> 处理器中更新依赖字段的选项(例如,国家 → 城市)

评论

支持 Markdown