Flutter表单验证插件simple_form_validator的使用

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

Flutter表单验证插件simple_form_validator的使用

简介

simple_form_validator 是一个用于简化 Flutter 表单字段验证的包。它仅依赖于 intl 包(主要用于年龄验证),并且具有以下特点:

  • 开源
  • 可扩展
  • 测试覆盖率 100%

示例

TextFormField(
  validator: (value) {
    return Validator.validate(value, [
      Required("输入不能为空"),
      ValidDateFormat("dd/MM/yyyy", "日期格式不正确"),
      MaxAge(15, "dd/MM/yyyy", "你太老了"),
      MinLength(2, "最小长度不正确")
    ]);
  },
)

快速开始

安装

在你的 Flutter 项目中添加 simple_form_validator 作为依赖项,在 pubspec.yaml 文件中添加以下行:

dependencies:
  simple_form_validator: "0.1.4"

然后运行 flutter pub get 来安装所需的依赖。

导入

在 Dart 小部件中导入 simple_form_validator 包:

import 'package:simple_form_validator/simple_form_validator.dart';

现在你可以使用 Validator 类来创建验证逻辑。这里是一个简单的验证器,用于检查输入是否为空或无效:

final invalidInput = Validator.validate("", [
  Required("输入不能为空"),
]);

final validInput = Validator.validate("ma", [
  Required("输入不能为空"),
]);

print(invalidInput); // 输入不能为空

print(validInput); // null,表示输入有效

验证类型

ValidationType(String errorMessage)

这是一个所有验证类型都需要继承的通用类。如果输入值不满足验证条件,则返回错误消息 errorMessage

MaxAge(int maxYears, String dateFormat, String errorMessage)

验证给定日期是否比 maxYears 年轻。如果输入日期格式不正确,也会返回错误消息。

MinAge(int minYears, String dateFormat, String errorMessage)

验证给定日期是否比 minYears 年长。如果输入日期格式不正确,也会返回错误消息。

MaxLength(int length, String errorMessage)

验证给定输入长度是否等于或小于 length

MinLength(int length, String errorMessage)

验证给定输入长度是否等于或大于 length

Regex(String expression, String errorMessage)

验证给定输入值是否匹配模式 expression

Required(String expression, String errorMessage)

验证给定输入值是否不为空或无效。

ValidDateFormat(String dateFormat, String errorMessage)

验证给定输入日期是否与 dateFormat 匹配。

Validator

该类包含最重要的验证方法 validate。如果有不同的验证类型传递给此方法,它将返回第一个不满足验证条件的验证类型的错误消息。

// 调用 validate 方法并传入一个不满足 Required 但满足 MinLength 的值,将返回 MinLength 错误消息
expect(
  "最小长度不正确",
  Validator.validate("mat", [
    Required("输入不能为空"),
    MinLength(5, "最小长度不正确")
  ])
);

// 调用 validate 方法并传入一个同时满足 Required 和 MinLength 的值,将返回 null
expect(
  null,
  Validator.validate("matej", [
    Required("输入不能为空"),
    MinLength(5, "最小长度不正确")
  ])
);

注意事项

扩展 ValidationType

如果你需要定义和验证其他验证类型,可以扩展 ValidationType 类。

class CustomValidationType extends ValidationType {
  CustomValidationType(super.errorMessage);

  [@override](/user/override)
  bool isValid(String? inputValue) {
    // 实现验证条件
  }
}

支持

如果你愿意支持这个库,可以建议一些尚未实现的验证类型。

完整示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    const appTitle = '表单验证演示';

    return MaterialApp(
      title: appTitle,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(appTitle),
        ),
        body: const MyCustomForm(),
      ),
    );
  }
}

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

  [@override](/user/override)
  MyCustomFormState createState() {
    return MyCustomFormState();
  }
}

class MyCustomFormState extends State<MyCustomForm> {
  final _formKey = GlobalKey<FormState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextFormField(
            decoration: const InputDecoration(
              hintText: '必需,最大长度检查',
            ),
            validator: (value) {
              return Validator.validate(value, [
                Required("输入不能为空"),
                MaxLength(4, "最大长度不正确")
              ]);
            },
          ),
          TextFormField(
            decoration: const InputDecoration(
              hintText: '必需,日期格式验证,最大年龄和最小长度检查',
            ),
            validator: (value) {
              return Validator.validate(value, [
                Required("输入不能为空"),
                ValidDateFormat("dd/MM/yyyy", "日期格式不正确"),
                MaxAge(15, "dd/MM/yyyy", "你太老了"),
                MinLength(2, "最小长度不正确")
              ]);
            },
          ),
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 16.0),
            child: ElevatedButton(
              onPressed: () {
                if (_formKey.currentState!.validate()) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text('处理数据中')),
                  );
                }
              },
              child: const Text('提交'),
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 simple_form_validator 插件进行 Flutter 表单验证的示例代码。这个插件可以帮助你简化表单字段的验证过程。

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

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

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

接下来是一个简单的 Flutter 应用示例,展示了如何使用 simple_form_validator 插件进行表单验证:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  final _formValidator = SimpleFormValidator({
    'email': Validators.email,
    'password': Validators.compose([
      Validators.required,
      Validators.minLength(6),
    ]),
    'confirmPassword': Validators.compose([
      Validators.required,
      Validators.equalsField('password'),
    ]),
  });

  Map<String, String> _formData = {};

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Form Validation Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          validator: (form) {
            return _formValidator.validate(form);
          },
          onSubmit: () {
            if (_formKey.currentState!.validate()) {
              _formKey.currentState!.save();
              print('Form Data: $_formData');
            }
          },
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  return _formValidator.errorsFor('email')?.first;
                },
                onSaved: (value) {
                  _formData['email'] = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  return _formValidator.errorsFor('password')?.first;
                },
                onSaved: (value) {
                  _formData['password'] = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Confirm Password'),
                obscureText: true,
                validator: (value) {
                  return _formValidator.errorsFor('confirmPassword')?.first;
                },
                onSaved: (value) {
                  _formData['confirmPassword'] = value!;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  _formKey.currentState!.validate();
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. 依赖导入:在 pubspec.yaml 中添加 simple_form_validator 依赖。
  2. 表单验证器:创建 _formValidator 实例,并定义每个字段的验证规则。例如,email 字段使用 Validators.email 进行验证,password 字段使用 Validators.requiredValidators.minLength(6) 进行验证,confirmPassword 字段使用 Validators.requiredValidators.equalsField('password') 进行验证。
  3. 表单构建:使用 Form 小部件,并将 key 设置为 _formKeyvalidator 属性设置为 _formValidator.validate(form),以便在表单提交时执行验证。
  4. 文本表单字段:每个 TextFormField 都有一个 validator,它返回 _formValidator.errorsFor('fieldName')?.first,以显示相应的错误信息。onSaved 属性用于保存表单字段的值。
  5. 提交按钮:点击按钮时调用 _formKey.currentState!.validate() 方法进行验证。

这样,你就可以在 Flutter 应用中使用 simple_form_validator 插件进行表单验证了。

回到顶部