Flutter动态表单生成插件dynamic_forms_generator的使用
Flutter动态表单生成插件dynamic_forms_generator的使用
插件介绍
dynamic_forms_generator
是一个 Dart 库,用于根据简单的 YAML 格式自动生成模型和解析器部分。它简化了在 flutter_dynamic_forms
中编写单个组件所需的大量样板代码,特别是在模型和解析类中。
使用方法
- 将此包作为开发依赖项添加到项目中,并与
build_runner
一起使用:
dev_dependencies:
build_runner: ^1.0.0
dynamic_forms_generator: <latest version>
- 可选地在项目的根目录中添加一个
build.yaml
文件以覆盖默认导入:
targets:
$default:
builders:
dynamic_forms_generator:dynamicFormsBuilder:
options:
default_imports:
- "../components.dart"
components_to_ignore:
- "form_element.yaml"
- "validation.yaml"
comments:
- "ignore_for_file: unused_import"
strongly_cast_properties: false
default_imports
会为模型和解析文件生成这个导入行。components_to_ignore
不会为列出的组件生成任何内容。特别是form_element.yaml
和validation.yaml
已经有它们自己的模型和解析器,所以不需要显式列出它们。原因是这些类已经在dynamic_forms
库中包含,而其他组件可以扩展它们,生成器需要所有 YAML 定义才能正确分析其结构。
- 对于每个组件,你需要相应的
component_name.yaml
文件,格式如下:
type: checkBox
parentType: formElement
properties:
label:
type: string
value:
type: bool
default: false
isMutable: true
- 运行以下命令来生成模型和解析器:
pub run build_runner build
或如果使用 Flutter:
flutter packages pub run build_runner build
代替 build
,你可以使用 watch
来跟踪更改。更多信息,请参阅 build_runner
包。
组件描述结构
每个组件应包含所有必要的信息以便能够以 XML 格式表示。
示例组件定义:
type: checkBox
parentType: formElement
properties:
label:
type: string
value:
type: bool
default: false
isMutable: true
type: container
parentType: formElement
properties:
children:
type: formElement[]
contentProperty: children
type: singleSelectGroup<tSingleSelectChoice extends singleSelectChoice>
parentType: formElement
properties:
value:
type: string
isMutable: true
choices:
type: tSingleSelectChoice[]
type: dropdownButton
parentType: singleSelectGroup<dropdownOption>
类型
类型可以设置为组件属性中的 type
,例如:
int
- 64 位二进制补码整数decimal
bool
string
dateTime
- 标准化日期时间格式(ISO 8601)typename
结尾为valueElement
或ValueElement
(例如moneyValueElement
)- 用于结构typename
结尾为enumElement
或EnumElement
(例如exampleEnumElement
)- 用于枚举enum
- 仅用于enumElement
组件customformElement
- 其他组件的名称customformElement[]
- 其他组件的数组
每个类型都可以通过附加 ?
后缀使其可选。
YAML 到 XML 转换
YAML 转换为 XML:
<element propertyName="property value"/>
表示直接属性值- 复杂值也可以写成:
<element> <element.propertyName> property value </element.propertyName> </element>
YAML 到 JSON 转换
JSON 转换类似于 YAML 到 XML,但不考虑 contentProperty
。
示例代码
void main() {
print('Hello world');
}
示例 demo
import 'package:flutter/material.dart';
import 'package:dynamic_forms_generator/dynamic_forms_generator.dart';
void main() async () async {
final component = Component(
type: 'checkbox',
parentType: 'formElement',
properties: {
'label': {'type': 'string'},
'value': {'type': 'bool', 'default': false, 'isMutable': true},
},
);
final model = Model(component);
final parser = Parser(model);
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Dynamic Form Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: TextEditingController(text: model.value),
decoration: InputDecoration(labelText: 'Checkbox Value'),
),
RaisedButton(
onPressed: () {
if (model.value == null) {
model.value = false;
} else {
model.value = !model.value;
}
parser.parse(model);
},
child: Text(model.value.toString()),
),
],
),
),
),
));
}
class Component {
String type;
String parentType;
Map<String, Map<String, dynamic>> properties;
Component({this.type, this.parentType, this.properties});
}
class Model {
Component component;
bool value;
Model(this.component);
}
class Parser {
Model model;
Parser(this.model);
void parse(Model model) {
this.model = model;
}
}
更多关于Flutter动态表单生成插件dynamic_forms_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动态表单生成插件dynamic_forms_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 dynamic_forms_generator
插件在 Flutter 中动态生成表单的代码示例。这个插件允许你根据 JSON 配置动态生成表单。
首先,确保你已经在 pubspec.yaml
文件中添加了 dynamic_forms_generator
依赖:
dependencies:
flutter:
sdk: flutter
dynamic_forms_generator: ^最新版本号 # 请替换为最新版本号
然后运行 flutter pub get
以获取依赖。
以下是一个完整的示例,展示了如何使用 dynamic_forms_generator
插件:
import 'package:flutter/material.dart';
import 'package:dynamic_forms/dynamic_forms.dart';
import 'package:dynamic_forms_generator/dynamic_forms_generator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Dynamic Forms Generator Example'),
),
body: DynamicFormBuilderExample(),
),
);
}
}
class DynamicFormBuilderExample extends StatefulWidget {
@override
_DynamicFormBuilderExampleState createState() => _DynamicFormBuilderExampleState();
}
class _DynamicFormBuilderExampleState extends State<DynamicFormBuilderExample> {
final _formJson = '''
{
"type": "FormGroup",
"elements": [
{
"type": "TextBox",
"label": "Name",
"validators": [
{
"type": "RequiredValidator"
}
]
},
{
"type": "NumberBox",
"label": "Age",
"validators": [
{
"type": "RangeValidator",
"minValue": 0,
"maxValue": 150
}
]
},
{
"type": "CheckBox",
"label": "Accept Terms",
"validators": [
{
"type": "RequiredValidator"
}
]
},
{
"type": "DatePicker",
"label": "Date of Birth",
"validators": []
}
]
}
''';
@override
Widget build(BuildContext context) {
final formModel = FormModel.fromJson(_formJson);
return Padding(
padding: const EdgeInsets.all(16.0),
child: DynamicFormBuilder(
formModel: formModel,
onSubmit: (Map<String, dynamic> values) {
print('Form submitted with values: $values');
},
),
);
}
}
代码解释
-
依赖添加:在
pubspec.yaml
文件中添加dynamic_forms_generator
依赖。 -
主应用:
MyApp
类定义了应用的主结构,包含一个Scaffold
和一个DynamicFormBuilderExample
组件。 -
表单构建器:
DynamicFormBuilderExample
是一个StatefulWidget
,它持有一个 JSON 字符串_formJson
,该字符串定义了表单的结构和验证规则。 -
JSON 表单定义:
_formJson
包含了表单元素的定义,包括文本框(TextBox
)、数字框(NumberBox
)、复选框(CheckBox
)和日期选择器(DatePicker
)。每个元素都有相应的标签和验证器。 -
表单模型:在
build
方法中,将 JSON 字符串解析为FormModel
对象。 -
表单构建:使用
DynamicFormBuilder
组件根据FormModel
对象生成动态表单,并定义onSubmit
回调以处理表单提交事件。
这个示例展示了如何使用 dynamic_forms_generator
插件从 JSON 配置动态生成表单,并处理表单的提交事件。你可以根据需要调整 JSON 配置以生成不同类型的表单元素和验证规则。