Flutter多步骤表单插件dynamic_multi_step_form的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter多步骤表单插件dynamic_multi_step_form的使用

概述

在填写包含大量字段的表单时,用户体验可能会受到影响。为了解决这个问题,可以使用多步骤表单(Multi-step Form),将长表单分解成多个短小的部分。dynamic_multi_step_form 是一个Flutter插件,它可以帮助开发者轻松实现动态多步骤表单,并支持从服务器或本地JSON配置表单字段和验证规则。

插件功能

  • 支持根据字段类型动态管理多步骤表单。
  • 自动管理字段级别的验证。
  • 开发者可以方便地自定义字段装饰样式。

环境要求

  • Android: SDK 21+
  • iOS: 10.0+

使用指南

安装插件

首先,在您的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  dynamic_multi_step_form: ^1.1.5

然后运行 flutter pub get 来安装插件。

示例代码

以下是一个完整的示例,展示如何使用 dynamic_multi_step_form 创建一个多步骤表单:

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:dynamic_multi_step_form/dynamic_multi_step_form.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dynamic Multi Step Form',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: MyForm(),
    );
  }
}

class MyForm extends StatefulWidget {
  @override
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final GlobalKey<DynamicFormState> _formKeyNew = GlobalKey<DynamicFormState>();

  String jsonString = '''
  [
    {
      "step": 1,
      "fields": [
        {
          "type": "text",
          "label": "Name",
          "key": "name",
          "validation": {
            "required": true,
            "minLength": 3
          }
        },
        {
          "type": "email",
          "label": "Email",
          "key": "email",
          "validation": {
            "required": true,
            "email": true
          }
        }
      ]
    },
    {
      "step": 2,
      "fields": [
        {
          "type": "password",
          "label": "Password",
          "key": "password",
          "validation": {
            "required": true,
            "minLength": 6
          }
        }
      ]
    }
  ]
  ''';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic Multi Step Form'),
      ),
      body: Column(
        children: [
          Expanded(
            child: DynamicForm(
              jsonString,
              dynamicFormKey: _formKeyNew,
              finalSubmitCallBack: (int currentPage, Map<String, dynamic> data) async {
                // 获取所有输入的信息并跳转到另一个页面显示输入信息
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondScreen(data: data)),
                );
              },
              currentStepCallBack: ({
                int? currentIndex,
                Map<String, dynamic>? formSubmitData,
                Map<String, dynamic>? formInformation,
              }) {
                setState(() {
                  // 更新当前步骤索引
                  currentPageIndex = currentIndex!;
                });
              },
            ),
          ),
          Container(
            color: Colors.white,
            padding: EdgeInsets.symmetric(horizontal: 15).copyWith(bottom: 8),
            child: ElevatedButton(
              style: ElevatedButton.styleFrom(
                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
                backgroundColor: Colors.black,
                maximumSize: Size(MediaQuery.of(context).size.width, 45),
                minimumSize: Size(MediaQuery.of(context).size.width, 45),
              ),
              clipBehavior: Clip.hardEdge,
              onPressed: () async {
                // 验证表单并移动到下一步
                _formKeyNew.currentState!.nextStepCustomClick();
              },
              child: const Text('Next'),
            ),
          )
        ],
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  final Map<String, dynamic> data;

  SecondScreen({required this.data});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Submitted Data'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Name: ${data['name']}'),
            Text('Email: ${data['email']}'),
            Text('Password: ${data['password']}'),
          ],
        ),
      ),
    );
  }
}

说明

  • jsonString: 这是一个JSON字符串,描述了每个步骤及其字段。每个字段都有类型、标签和验证规则。
  • DynamicForm: 这是核心组件,负责渲染表单并处理用户交互。
  • finalSubmitCallBack: 当用户完成所有步骤并提交表单时调用。
  • currentStepCallBack: 在每次提交当前步骤时调用,可以用来更新UI或其他逻辑。

结论

通过使用 dynamic_multi_step_form 插件,您可以轻松创建复杂且动态的多步骤表单。该插件提供了丰富的配置选项,使您能够根据需要自定义表单的行为和外观。希望这个示例能帮助您快速上手并应用到实际项目中。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用dynamic_multi_step_form插件来创建多步骤表单的示例代码。这个插件允许你轻松地创建和管理多步骤表单。

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

dependencies:
  flutter:
    sdk: flutter
  dynamic_multi_step_form: ^最新版本号  # 请替换为实际最新版本号

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

接下来,创建一个包含多步骤表单的Flutter页面。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:dynamic_multi_step_form/dynamic_multi_step_form.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Multi Step Form Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MultiStepFormPage(),
    );
  }
}

class MultiStepFormPage extends StatefulWidget {
  @override
  _MultiStepFormPageState createState() => _MultiStepFormPageState();
}

class _MultiStepFormPageState extends State<MultiStepFormPage> {
  final List<Step> steps = [
    Step(
      title: 'Step 1',
      content: TextFormField(
        decoration: InputDecoration(labelText: 'Enter Name'),
      ),
    ),
    Step(
      title: 'Step 2',
      content: TextFormField(
        decoration: InputDecoration(labelText: 'Enter Email'),
        keyboardType: TextInputType.emailAddress,
      ),
    ),
    Step(
      title: 'Step 3',
      content: TextFormField(
        decoration: InputDecoration(labelText: 'Enter Password'),
        obscureText: true,
      ),
    ),
  ];

  final formKey = GlobalKey<FormState>();

  void _submitForm() {
    if (formKey.currentState!.validate()) {
      formKey.currentState!.save();
      // 处理表单数据
      print('Form submitted!');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi Step Form'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: DynamicMultiStepForm(
          steps: steps,
          formKey: formKey,
          onFormSubmitted: _submitForm,
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. 定义步骤:在steps列表中,每个Step对象包含一个标题和一个内容(这里使用TextFormField作为内容)。

  2. 创建表单键:使用GlobalKey<FormState>来跟踪表单的状态。

  3. 表单提交处理_submitForm方法用于在表单验证成功后处理表单数据。

  4. 构建页面:在build方法中,使用DynamicMultiStepForm组件来显示多步骤表单,并传入步骤列表、表单键和提交处理函数。

请注意,这个示例中还没有为TextFormField添加控制器或验证器。如果你需要验证用户输入,你可以使用TextFormFieldvalidator属性,并为其添加相应的验证逻辑。

例如,为“Enter Email”字段添加验证器:

TextFormField(
  decoration: InputDecoration(labelText: 'Enter Email'),
  keyboardType: TextInputType.emailAddress,
  validator: (value) {
    if (value == null || value.isEmpty || !value.contains('@')) {
      return 'Please enter a valid email address.';
    }
    return null;
  },
),

希望这个示例能帮助你理解如何在Flutter项目中使用dynamic_multi_step_form插件来创建多步骤表单。

回到顶部