Flutter动态表单构建插件flutter_dynamic_forms_components的使用

Flutter动态表单构建插件flutter_dynamic_forms_components的使用

flutter_dynamic_forms_components

pub package

flutter_dynamic_forms_components 是一个用于 Flutter 的项目,其中包含 flutter_dynamic_forms 库的默认组件集。

大多数组件都是通过 dynamic_forms_generator 生成的。

注意:在 IDE 中运行 flutter packages pub run build_runner build 后,示例项目可能无法正常工作。您可以通过删除 .dart_tool 文件夹来解决此问题。

完整示例代码

以下是一个完整的示例代码,演示如何使用 flutter_dynamic_forms_components 插件创建动态表单。

import 'package:example/advanced_expression_form/advanced_expression_form.dart';
import 'package:example/custom_expression_form/custom_expression_form.dart';
import 'package:example/simple_submit_form/simple_submit_form.dart';
import 'package:flutter_dynamic_forms/flutter_dynamic_forms.dart';
import 'package:dynamic_forms/dynamic_forms.dart';
import 'package:example/simple_form/simple_form_xml.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dynamic_forms_components/flutter_dynamic_forms_components.dart' as components;
import 'package:flutter/material.dart';
import 'package:example/bloc_dynamic_form/dynamic_form_bloc.dart';
import 'package:example/bloc_dynamic_form/dynamic_form_screen.dart';
import 'package:example/simple_form/simple_form_json.dart';
import 'package:example/transition_form/transition_form_bloc.dart';
import 'package:example/transition_form/transition_form_builder.dart';
import 'package:example/transition_form/transition_form_screen.dart';

import 'bloc_dynamic_form/custom_form_manager.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WelcomeScreen(),
    );
  }
}

class WelcomeScreen extends StatefulWidget {
  WelcomeScreen({Key? key}) : super(key: key);

  _WelcomeScreenState createState() => _WelcomeScreenState();
}

class _WelcomeScreenState extends State<WelcomeScreen> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => SimpleFormXml(),
                  ),
                );
              },
              child: Text('简单XML表单'),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => SimpleFormJson(),
                    ),
                  );
                },
                child: Text('简单JSON表单'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => SimpleSubmitForm(),
                    ),
                  );
                },
                child: Text('简单提交表单'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => CustomExpressionForm(),
                    ),
                  );
                },
                child: Text('自定义表达式表单'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => AdvancedExpressionForm(),
                    ),
                  );
                },
                child: Text('高级表达式表单'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => FormProvider(
                        create: (_) => CustomFormManager(),
                        child: BlocProvider(
                          create: (context) {
                            return DynamicFormBloc(
                                FormProvider.of<CustomFormManager>(context));
                          },
                          child: DynamicFormScreen(),
                        ),
                      ),
                    ),
                  );
                },
                child: Text('带Bloc的动态表单'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16),
              child: ElevatedButton(
                onPressed: () {
                  var formBuilder = FormBuilder(
                    XmlFormParserService(
                      components.getDefaultParserList(),
                    ),
                  );
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => BlocProvider(
                        create: (context) {
                          return TransitionFormBloc(
                            formBuilder,
                            TransitionFormBuilder(formBuilder),
                          );
                        },
                        child: TransitionFormScreen(),
                      ),
                    ),
                  );
                },
                child: Text('过渡动态表单'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter动态表单构建插件flutter_dynamic_forms_components的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态表单构建插件flutter_dynamic_forms_components的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_dynamic_forms_components 插件来构建动态表单的示例。这个插件允许你根据JSON结构动态生成表单,非常适合需要高度可配置表单的应用场景。

首先,确保你已经在 pubspec.yaml 文件中添加了依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_dynamic_forms_components: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来安装依赖。

以下是一个简单的示例,展示如何使用 flutter_dynamic_forms_components 来构建动态表单:

import 'package:flutter/material.dart';
import 'package:flutter_dynamic_forms/flutter_dynamic_forms.dart';
import 'package:flutter_dynamic_forms_components/flutter_dynamic_forms_components.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Dynamic Forms Example'),
        ),
        body: DynamicFormBuilderExample(),
      ),
    );
  }
}

class DynamicFormBuilderExample extends StatefulWidget {
  @override
  _DynamicFormBuilderExampleState createState() => _DynamicFormBuilderExampleState();
}

class _DynamicFormBuilderExampleState extends State<DynamicFormBuilderExample> {
  final JsonFormMapper _formMapper = JsonFormMapper();
  FormGroup? _formGroup;

  @override
  void initState() {
    super.initState();
    loadForm();
  }

  Future<void> loadForm() async {
    // 模拟从服务器获取表单配置
    String jsonForm = '''
    {
      "type": "FormGroup",
      "children": [
        {
          "type": "TextField",
          "key": "name",
          "label": "Name",
          "validators": [
            {
              "type": "RequiredValidator"
            }
          ]
        },
        {
          "type": "EmailField",
          "key": "email",
          "label": "Email",
          "validators": [
            {
              "type": "RequiredValidator"
            },
            {
              "type": "EmailValidator"
            }
          ]
        },
        {
          "type": "BooleanField",
          "key": "agreeTerms",
          "label": "I agree to the terms and conditions",
          "validators": [
            {
              "type": "RequiredValidator"
            }
          ]
        }
      ]
    }
    ''';

    // 解析JSON表单配置
    final Map<String, dynamic> jsonMap = jsonDecode(jsonForm);
    _formGroup = _formMapper.fromJson(jsonMap) as FormGroup?;

    if (_formGroup != null) {
      // 设置初始值(可选)
      _formGroup!.value['name'] = 'John Doe';
      // 监听表单变化
      _formGroup!.valueChanges.listen((_) {
        print('Form values: $_formGroup!');
      });
    }

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    if (_formGroup == null) {
      return Center(child: CircularProgressIndicator());
    }

    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: FormConsumer(
        formGroup: _formGroup!,
        builder: (context, formGroup, child) {
          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              DynamicFormComponentFactory().build(context, formGroup.children.first),
              SizedBox(height: 16),
              DynamicFormComponentFactory().build(context, formGroup.children[1]),
              SizedBox(height: 16),
              DynamicFormComponentFactory().build(context, formGroup.children.last),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  if (formGroup.validate()) {
                    print('Form is valid: ${formGroup.value}');
                    // 处理表单提交
                  }
                },
                child: Text('Submit'),
              ),
            ],
          );
        },
      ),
    );
  }
}

在这个示例中:

  1. 我们首先定义了一个简单的表单配置JSON字符串,它包含了一个文本字段、一个电子邮件字段和一个布尔字段。
  2. 使用 JsonFormMapper 将JSON字符串解析为 FormGroup 对象。
  3. 使用 DynamicFormComponentFactory 根据 FormGroup 中的字段类型动态生成相应的表单组件。
  4. 在表单组件生成后,监听表单值的变化,并在提交按钮点击时验证表单。

注意:flutter_dynamic_forms_components 插件可能会随着版本更新而有所变化,因此请查阅最新的官方文档和示例代码以确保兼容性。

回到顶部