Flutter表单构建插件flutter_form_craft的使用

Flutter表单构建插件flutter_form_craft的使用

简介

Flutter FormCraft插件简化了在Flutter应用中管理表单的过程,提供了方便的工具集来构建和与表单进行交互。

特性

  • 表单管理:轻松管理Flutter应用中的FormCraftTextField小部件。
  • 验证:使用可定制的验证规则和错误消息验证表单字段。
  • 字段交互:程序化地访问、修改和提交表单字段值。
  • 自定义:根据应用程序的需求自定义表单字段的行为、外观和验证规则。

为什么使用FormCraft?

FormCraft简化了Flutter中的表单开发,提供了创建、验证和与表单交互的直观API。无论你是在构建简单的登录表单还是复杂的多步骤向导,FormCraft都可以简化表单管理,减少样板代码并加速开发。

开始使用

要在你的Flutter项目中开始使用FormCraft,只需将包添加到你的pubspec.yaml文件中:

dependencies:
  form_craft: ^0.0.1

使用方法

1. FormCraft

FormCraft类是一个强大的工具,旨在简化Flutter应用中表单字段的管理和交互。它的主要目标是简化在Flutter应用中构建和验证表单的过程。

创建FormCraft
final formCraft = FormCraft();

/// 您可以这样构建文本字段。
///
/// 第一个参数是文本字段的键。这是验证表单所必需的。通过使用此键,您可以获取文本字段的值并验证它。还可以找到文本字段的焦点节点。
/// 第二个参数是文本字段的构造函数。您可以使用它来构建您的文本字段。
/// 构造函数只有一个参数。它是文本字段的全局键。您应该将它提供给FormCraftTextField。
_formCraft.buildTextField(
  'new_field',
  (globalKey) => CustomFormTextField(
  globalKey: globalKey,
  ...
  ),
),

/// 您可以通过这种方式获取焦点节点。
final focusNode = _formCraft.getFocusNode('login');
focusNode.requestFocus();

/// FormCraft允许您重新分配文本字段的初始值。或者,您可以随时更改输入文本值。
_formCraft.reassignInputValue('login', 'Initial value for login');

/// 您可以通过这种方式清除表单。
_formCraft.refreshForm();

/// 您可以为表单设置验证类型。默认情况下,它是FormCraftValidationType.onSubmit。
_formCraft.setValidationType(FormCraftValidationType.onSubmit);
验证方式

FormCraft提供两种验证方式:FormCraftValidationType.onSubmit 和 FormCraftValidationType.always。默认是FormCraftValidationType.onSubmit。

  1. FormCraftValidationType.onSubmit - 当调用方法时验证表单:
/// 如果表单有效,则返回true。
final isValid = _formCraft.validate()
  1. FormCraftValidationType.always - 当开始输入值时验证表单。每个字段将单独验证。

您可以调用方法更改验证类型:

_formCraft.setValidationType(FormCraftValidationType.always);

重要提示:必须在构建小部件后设置验证类型以应用更改。否则,验证类型将不被应用。例如,您可以在initState中执行此操作:

 [@override](/user/override)
  void initState() {
    _formCraft = FormCraft();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _formCraft.setValidationType(FormCraftValidationType.always);
    });
    super.initState();
  }

2. TextField

  1. 在使用该包时,必须使用FormCraftTextField:
FormCraftTextField(...)
  1. FormCraft 提供了一个.buildTextField方法,您需要提供FormCraftTextField或自定义文本字段。(不用担心,您可以基于FormCraftTextField创建自己的文本字段)
_formCraft.buildTextField(
  'login',
  (globalKey) => FormCraftTextField(
  /// 全局键是表单验证所必需的。如果您想使用表单验证,应像这样提供全局键。
  globalKey: globalKey,

  /// 与TextFormField相同的方法。
  onChanged: (value) {},

  /// 文本字段的初始值。
  initialValue: 'Initial value for login',

  /// 您可以在这里指定自定义(例如从服务器获取的错误消息等)错误消息。
  customErrorMessage: 'Custom error message for login',
              
  validators: [
    /// 您可以像这样使用内置验证器。
    FormCraftValidator.required(),
  ],
  /// 如果您想为文本字段创建自定义装饰,可以使用decorationBuilder。
  /// 不要忘记提供`errorMessage`以显示错误消息。
  decorationBuilder: (errorMessage) => InputDecoration(
    labelText: 'Login',
    errorText: errorMessage,
  ),

  /// 剩下的部分您可以像在TextFormField中一样处理。
    ),
  ),
  1. 当然,您可以创建自定义文本字段:
class CustomFormTextField extends StatelessWidget {
  final Function(String value) onChanged;
  final List<FormCraftFieldValidator>? validators;
  final String? initialValue;
  final Key globalKey;
  const CustomFormTextField({
    required this.onChanged,
    required this.globalKey,
    this.validators,
    this.initialValue,
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FormCraftTextField(
      globalKey: globalKey,
      onChanged: onChanged,
      initialValue: initialValue,
      validators: validators,
      decorationBuilder: (errorMessage) => InputDecoration(
        errorBorder:
            UnderlineInputBorder(borderSide: BorderSide(color: Colors.red)),
        focusedErrorBorder:
            UnderlineInputBorder(borderSide: BorderSide(color: Colors.red)),
        errorText: errorMessage,
      ),
    );
  }
}

3. 验证

FormCraft 提供了一些预定义的验证器:

  • FormCraftValidator.required() - 必填文本字段。
  • FormCraftValidator.email() - 检查电子邮件是否非空且符合有效的电子邮件格式
FormCraftTextField(
              ...,
              validators: [
                FormCraftValidator.required(),
              ],
            ),
          ),

如果您想更改错误消息,只需传递消息作为参数:

FormCraftTextField(
              ...,
              validators: [
                 FormCraftValidator.email('Please enter a valid email address'),
              ],
            ),
          ),

您还可以创建自己的自定义验证器。FormCraft 提供了两种方法:

  1. 使用FormCraftValidator.custom
// 创建您的自定义验证器
FormCraftValidator.custom(
    message: 'Password to short',
    predicate: (input) => input!.length > 6,
  );

FormCraftTextField(
  ...,
  validators: [
  FormCraftValidator.custom(
  message: 'Password to short',
  predicate: (input) => input!.length > 6,
      );
    ],
  ),
),
  1. 您可以创建自己的验证器:
class CustomValidator implements FormCraftValidator {
  final String message;

  const CustomValidator({
    required this.message,
  });

  [@override](/user/override)
  String? validate(String input) {
    /// 输入必须大于6个字符。
    /// 如果验证失败则返回错误消息,否则返回`null`。
    return input.length > 6 ? null : message;
  }
}

FormCraftTextField(
  ...,
  validators: [CustomValidator()],
  ),
),

4. 完整示例

class LoginScreen extends StatefulWidget {
  const LoginScreen({super.key});

  [@override](/user/override)
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  late final FormCraft _formCraft;
  
  [@override](/user/override)
  void initState() {
    _formCraft = FormCraft();
    /// 您可以像这样更改验证类型。
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _formCraft.setValidationType(FormCraftValidationType.onSubmit);
    });
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    // 不要忘记释放数据。
    _formCraft.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          _formCraft.buildTextField(
            'login',
            (globalKey) => FormCraftTextField(
              globalKey: globalKey,
              onChanged: (value) {},
              initialValue: 'Initial value for login',
              customErrorMessage: 'Custom error message for login',
              validators: [
                FormCraftValidator.required(),
              ],
              decorationBuilder: (errorMessage) => InputDecoration(
                labelText: 'Login',
                errorText: errorMessage,
              ),
            ),
          ),
          _formCraft.buildTextField(
            'email',
            (globalKey) => FormCraftTextField(
              globalKey: globalKey,
              onChanged: (value) {},
              validators: [
                FormCraftValidator.email('Please enter the correct email format'),
              ],
            ),
          ),
          ElevatedButton(
            child: Text('Login'),
            onPressed: () {
              final isValid = _formCraft.validate();
              if (isValid) {
                final result = _formCraft.submitForm();
                final loginResult = result['login'];
              }
            },
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 flutter_form_craft 插件来构建 Flutter 表单的示例代码。flutter_form_craft 是一个用于简化 Flutter 表单构建的插件,它提供了一系列预定义的表单组件和验证功能。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_form_craft: ^最新版本号

然后,运行 flutter pub get 来获取依赖。

下面是一个完整的示例,展示了如何使用 flutter_form_craft 来创建一个简单的登录表单:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Form Craft Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginFormScreen(),
    );
  }
}

class LoginFormScreen extends StatefulWidget {
  @override
  _LoginFormScreenState createState() => _LoginFormScreenState();
}

class _LoginFormScreenState extends State<LoginFormScreen> {
  final _formKey = GlobalKey<FormCraftState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Login Form'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: FormCraft(
          key: _formKey,
          child: Column(
            children: [
              TextFormFieldCraft(
                labelText: 'Email',
                validators: [
                  Validators.required('Email is required'),
                  Validators.email('Invalid email address'),
                ],
              ),
              SizedBox(height: 16),
              TextFormFieldCraft(
                labelText: 'Password',
                obscureText: true,
                validators: [
                  Validators.required('Password is required'),
                  Validators.minLength(6, 'Password must be at least 6 characters long'),
                ],
              ),
              SizedBox(height: 24),
              ElevatedButton(
                onPressed: () async {
                  final form = _formKey.currentState;
                  if (form!.validate()) {
                    form.save();
                    // Handle form submission here
                    print('Form submitted successfully');
                  }
                },
                child: Text('Login'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 依赖引入:确保在 pubspec.yaml 中引入了 flutter_form_craft 依赖。

  2. 主应用入口MyApp 类定义了应用的主入口,设置了一个基本的 MaterialApp

  3. 表单屏幕LoginFormScreen 是一个有状态的组件,用于构建登录表单。

  4. 表单键:使用 GlobalKey<FormCraftState> 来管理表单状态。

  5. 表单组件

    • TextFormFieldCraft 用于创建文本输入字段。
    • labelText 设置标签文本。
    • validators 列表定义了表单验证规则。
    • obscureText: true 用于密码字段,使输入内容隐藏。
  6. 表单提交:使用 ElevatedButton 创建提交按钮,点击按钮时调用 validate 方法验证表单,如果验证通过则调用 save 方法保存表单数据并进行后续处理。

这个示例展示了如何使用 flutter_form_craft 插件来快速构建和验证一个简单的登录表单。根据需求,你可以进一步自定义和扩展表单组件和验证规则。

回到顶部