动态表单应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
适配的第三方库地址:
- rfw: https://pub.dev/packages/rfw
- shared_preferences: https://pub.dev/packages/shared_preferences
- animations: https://pub.dev/packages/animations
- file_selector: https://pub.dev/packages/file_selector
一、项目概述
运行效果图




1.1 应用简介
动态表单应用是一款灵活强大的表单生成与管理工具,支持动态表单生成、表单配置、表单验证、表单提交等核心功能。应用以优雅的紫色为主色调,象征专业与创新。涵盖模板管理、表单填写、数据统计、系统设置四大模块,用户可以创建自定义表单模板、配置字段类型与验证规则、收集并管理表单数据。
1.2 核心功能
| 功能模块 |
功能描述 |
实现方式 |
| 模板管理 |
创建、编辑、删除表单模板 |
模板引擎 |
| 动态渲染 |
根据配置动态生成表单 |
组件工厂 |
| 表单验证 |
必填、格式、范围验证 |
验证引擎 |
| 数据收集 |
表单提交与数据存储 |
数据管理 |
| 字段配置 |
多种字段类型配置 |
配置系统 |
| 模板导入 |
导入外部模板文件 |
文件解析 |
| 数据导出 |
导出提交数据 |
数据导出 |
1.3 支持的字段类型
| 序号 |
类型名称 |
图标 |
描述 |
适用场景 |
| 1 |
文本 |
text_fields |
单行文本输入 |
姓名、标题 |
| 2 |
数字 |
numbers |
数值输入 |
年龄、数量 |
| 3 |
邮箱 |
email |
邮箱地址 |
联系邮箱 |
| 4 |
电话 |
phone |
电话号码 |
联系电话 |
| 5 |
下拉选择 |
arrow_drop_down_circle |
下拉单选 |
分类选择 |
| 6 |
单选 |
radio_button_checked |
单选按钮 |
性别、等级 |
| 7 |
多选 |
check_box |
复选框组 |
兴趣爱好 |
| 8 |
开关 |
toggle_on |
开关切换 |
订阅、同意 |
| 9 |
日期 |
calendar_today |
日期选择 |
生日、日期 |
| 10 |
时间 |
access_time |
时间选择 |
预约时间 |
| 11 |
多行文本 |
notes |
多行文本域 |
描述、反馈 |
| 12 |
评分 |
star |
星级评分 |
满意度 |
1.4 验证规则定义
| 序号 |
验证类型 |
规则描述 |
示例 |
| 1 |
必填验证 |
字段不能为空 |
required: true |
| 2 |
正则验证 |
自定义正则表达式 |
validationRegex: r’^1[3-9]\d{9}$’ |
| 3 |
范围验证 |
数值范围限制 |
minValue: 1, maxValue: 150 |
| 4 |
邮箱验证 |
标准邮箱格式 |
type: FieldType.email |
| 5 |
电话验证 |
手机号格式 |
type: FieldType.phone |
1.5 技术栈
| 技术领域 |
技术选型 |
版本要求 |
| 开发框架 |
Flutter |
>= 3.0.0 |
| 编程语言 |
Dart |
>= 2.17.0 |
| 设计规范 |
Material Design 3 |
- |
| 状态管理 |
StatefulWidget |
- |
| 数据存储 |
内存存储 |
- |
| 目标平台 |
鸿蒙OS / Web |
API 21+ |
1.6 项目结构
lib/
└── main_dynamic_form.dart
├── DynamicFormApp # 应用入口
├── FieldType # 字段类型枚举
├── FormFieldConfig # 字段配置模型
├── FormTemplate # 表单模板模型
├── FormData # 表单数据模型
├── DynamicFormHomePage # 主页面(底部导航)
├── _buildTemplatesPage # 模板管理页
├── _buildFormPage # 表单填写页
├── _buildDataPage # 数据统计页
├── _buildSettingsPage # 设置页
├── _validateField # 字段验证方法
├── _buildFieldWidget # 字段组件工厂
├── _NewTemplateDialog # 新建模板对话框
├── _TemplateEditorPage # 模板编辑页面
└── _AddFieldDialog # 添加字段对话框
二、系统架构
2.1 整体架构图
2.2 表单渲染流程
2.3 验证流程
三、核心功能实现
3.1 字段配置模型
class FormFieldConfig {
final String id;
final String label;
final FieldType type;
final String placeholder;
final bool required;
final String? validationRegex;
final String? validationMessage;
final List<String>? options;
final double? minValue;
final double? maxValue;
final String? defaultValue;
}
3.2 表单模板模型
class FormTemplate {
final String id;
final String name;
final String description;
final List<FormFieldConfig> fields;
final DateTime createdAt;
final DateTime updatedAt;
}
3.3 验证引擎实现
bool _validateField(FormFieldConfig field, dynamic value) {
if (field.required) {
if (value == null || value.toString().isEmpty) {
return false;
}
if (value is List && value.isEmpty) {
return false;
}
}
if (value != null && field.validationRegex != null) {
final regex = RegExp(field.validationRegex!);
if (!regex.hasMatch(value.toString())) {
return false;
}
}
if (field.type == FieldType.number) {
final numValue = double.tryParse(value.toString());
if (numValue != null) {
if (field.minValue != null && numValue < field.minValue!) {
return false;
}
if (field.maxValue != null && numValue > field.maxValue!) {
return false;
}
}
}
return true;
}
3.4 动态组件工厂
Widget _buildFieldWidget(FormFieldConfig field) {
switch (field.type) {
case FieldType.text:
case FieldType.email:
case FieldType.phone:
return TextField(...);
case FieldType.dropdown:
return DropdownButtonFormField<String>(...);
case FieldType.radio:
return Column(children: field.options?.map((option) {
return RadioListTile<String>(...);
}).toList() ?? []);
case FieldType.checkbox:
return Wrap(children: field.options?.map((option) {
return FilterChip(...);
}).toList() ?? []);
case FieldType.date:
return DatePicker(...);
case FieldType.rating:
return StarRating(...);
}
}
四、界面设计
4.1 主界面布局
┌─────────────────────────────────────────────────────────────┐
│ 模板管理 │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📋 动态表单系统 共 3 个模板 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 选择模板 │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📄 用户信息表 ││
│ │ 收集用户基本信息 10 个字段 ││
│ └─────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📄 意见反馈表 ││
│ │ 收集用户反馈意见 6 个字段 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
├─────────────────────────────────────────────────────────────┤
│ [模板] [表单] [数据] [设置] │
└─────────────────────────────────────────────────────────────┘
4.2 表单填写界面
┌─────────────────────────────────────────────────────────────┐
│ 用户信息表 [重置] │
│ 收集用户基本信息 │
├─────────────────────────────────────────────────────────────┤
│ 姓名 * │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 请输入姓名 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 邮箱 * │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📧 请输入邮箱地址 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 性别 * │
│ ○ 男 ○ 女 ○ 其他 │
│ │
│ 满意度评分 │
│ ⭐ ⭐ ⭐ ☆ ☆ │
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📤 提交表单 ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
4.3 页面导航结构
五、交互设计
5.1 模板操作流程
5.2 表单填写流程
| 步骤 |
操作 |
系统响应 |
| 1 |
选择模板 |
加载字段配置,渲染表单 |
| 2 |
填写字段 |
实时保存输入值 |
| 3 |
点击提交 |
执行验证逻辑 |
| 4 |
验证通过 |
保存数据,显示成功提示 |
| 5 |
验证失败 |
显示错误信息,定位错误字段 |
5.3 字段类型交互
| 字段类型 |
交互方式 |
验证时机 |
| 文本 |
键盘输入 |
提交时 |
| 下拉选择 |
点击选择 |
提交时 |
| 单选 |
点击选项 |
提交时 |
| 多选 |
点击切换 |
提交时 |
| 开关 |
滑动切换 |
提交时 |
| 日期 |
弹窗选择 |
提交时 |
| 评分 |
点击星星 |
提交时 |
六、数据模型设计
6.1 实体关系图
6.2 JSON数据格式
{
"id": "user_info",
"name": "用户信息表",
"description": "收集用户基本信息",
"fields": [
{
"id": "name",
"label": "姓名",
"type": "text",
"placeholder": "请输入姓名",
"required": true
},
{
"id": "email",
"label": "邮箱",
"type": "email",
"required": true,
"validationRegex": "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$",
"validationMessage": "请输入有效的邮箱地址"
}
]
}
七、性能优化
7.1 渲染优化策略
| 优化项 |
实现方式 |
效果 |
| 懒加载 |
按需渲染字段 |
减少初始渲染时间 |
| 状态缓存 |
保存表单状态 |
避免重复渲染 |
| 虚拟滚动 |
长列表优化 |
提升滚动性能 |
| 防抖处理 |
输入防抖 |
减少验证次数 |
7.2 内存优化
const FormFieldConfig({
required this.id,
required this.label,
required this.type,
});
@override
void dispose() {
_nameController.dispose();
_descController.dispose();
super.dispose();
}
八、鸿蒙适配说明
8.1 适配要点
| 适配项 |
说明 |
状态 |
| 屏幕适配 |
支持不同屏幕尺寸 |
✅ |
| 触摸交互 |
支持触摸手势操作 |
✅ |
| 键盘输入 |
支持虚拟键盘 |
✅ |
| 文件系统 |
适配鸿蒙文件系统 |
⏳ |
| 权限管理 |
存储权限适配 |
⏳ |
8.2 第三方库适配状态
| 库名 |
功能 |
鸿蒙适配状态 |
| rfw |
动态组件 |
需适配 |
| shared_preferences |
数据存储 |
已适配 |
| animations |
动画效果 |
已适配 |
| file_selector |
文件选择 |
需适配 |
九、使用说明
9.1 创建表单模板
9.2 字段配置示例
| 字段 |
配置项 |
示例值 |
| 姓名 |
类型: 文本, 必填: 是 |
placeholder: 请输入姓名 |
| 邮箱 |
类型: 邮箱, 必填: 是 |
validationRegex: 邮箱正则 |
| 年龄 |
类型: 数字 |
minValue: 1, maxValue: 150 |
| 性别 |
类型: 单选 |
options: [男, 女, 其他] |
| 爱好 |
类型: 多选 |
options: [阅读, 运动, 音乐] |
9.3 验证规则配置
| 验证类型 |
配置方式 |
错误提示 |
| 必填 |
required: true |
此字段为必填项 |
| 邮箱格式 |
type: FieldType.email |
请输入有效的邮箱地址 |
| 手机号 |
validationRegex: 手机正则 |
请输入有效的手机号 |
| 数值范围 |
minValue/maxValue |
最小值/最大值为X |
十、扩展功能
10.1 未来规划
| 功能 |
优先级 |
预计版本 |
| 条件显示 |
高 |
v2.0 |
| 字段联动 |
高 |
v2.0 |
| 表单分页 |
中 |
v2.5 |
| 数据统计图表 |
中 |
v2.5 |
| 多语言支持 |
低 |
v3.0 |
| 表单模板市场 |
低 |
v3.0 |
10.2 自定义字段扩展
abstract class CustomFieldType {
String get typeName;
IconData get icon;
Widget build(FormFieldConfig config, dynamic value, Function(dynamic) onChanged);
bool validate(FormFieldConfig config, dynamic value);
}
void registerCustomField(CustomFieldType fieldType) {
}
十一、常见问题
11.1 FAQ
| 问题 |
解决方案 |
| 表单无法提交 |
检查必填字段是否填写完整 |
| 验证不生效 |
确认正则表达式格式正确 |
| 字段显示异常 |
检查字段类型配置 |
| 数据丢失 |
启用自动保存功能 |
11.2 错误代码
| 错误码 |
描述 |
解决方案 |
| E001 |
必填字段为空 |
填写必填字段 |
| E002 |
格式验证失败 |
检查输入格式 |
| E003 |
数值超出范围 |
输入有效范围内的值 |
| E004 |
模板不存在 |
选择有效的模板 |
所有评论(0)