Flutter表单验证插件form_validation的使用

Flutter表单验证插件form_validation的使用

目录

form_validation

form_validation 提供了一系列可以直接通过代码或从 JSON 构建的表单验证器,以提供更动态的验证。

使用库

pubspec.yaml 文件中添加依赖项:

dependencies:
  form_validation: ^latest_version

然后运行以下命令来获取包:

flutter packages get

内置验证器

以下是 form_validation 提供的内置验证器列表:

类名 类型 描述
CurrencyValidator currency 确保值是有效的货币格式
EmailValidator email 确保值是有效的电子邮件格式
MaxLengthValidator max_length 确保值不超过指定字符数
MaxNumberValidator max_number 确保值不大于指定数字
MinLengthValidator min_length 确保值不少于指定字符数
MinNumberValidator min_number 确保值不小于指定数字
NumberValidator number 确保值是有效的数字
PhoneNumberValidator phone_number 确保值是有效的电话号码格式
RequiredValidator required 确保值不为 null、空字符串或仅包含空白字符

注意:除了 RequiredValidator 外,所有内置验证器都会在值为 null 或空时通过验证。

验证消息和翻译

该库提供了默认的英文错误消息。可以通过更新 FormValidationTranslations.values 来更改语言。以下是可用的键:

参数 描述
form_validation_currency label 无效货币值
form_validation_currency_positive label 检测到有效的负货币值
form_validation_email label 无效电子邮件
form_validation_max_length label, length 字符数超过指定长度
form_validation_max_number label, number 数值大于指定数字
form_validation_min_length label, length 字符数少于指定长度
form_validation_min_number label, number 数值小于指定数字
form_validation_number label 需要数字但未检测到
form_validation_number_decimal label 检测到数字但不允许小数
form_validation_phone_number label 无效电话号码
form_validation_required label 必填项为空

JSON支持

Validator 类可以用于解码多个 ValueValidator 实例。每个内置验证器都可以通过 JSON 进行反序列化。以下是一个完整的 JSON 结构示例:

{
  "validators": [
    // 一个或多个验证器对象
  ]
}

CurrencyValidator

{
  "allowNegative": true, // 是否允许负值,默认为 true
  "type": "currency"
}

EmailValidator

{
  "type": "email"
}

MaxLengthValidator

{
  "length": 10, // 最大字符数
  "type": "max_length"
}

MaxNumberValidator

{
  "number": 100, // 最大数值
  "type": "max_number"
}

MinLengthValidator

{
  "length": 5, // 最小字符数
  "type": "min_length"
}

MinNumberValidator

{
  "number": 1, // 最小数值
  "type": "min_number"
}

NumberValidator

{
  "type": "number"
}

PhoneNumberValidator

{
  "type": "phone_number"
}

RequiredValidator

{
  "type": "required"
}

自定义验证器

可以通过扩展 ValueValidator 抽象类来自定义验证器,或者使用 registerCustomValidatorBuilder 函数注册自定义验证器类型。

示例

class MyCustomValidator extends ValueValidator {
  static const type = 'my_custom_validator';

  static MyCustomValidator fromDynamic(dynamic map) {
    if (map != null && map['type'] == type) {
      return MyCustomValidator();
    }
    return null;
  }

  @override
  Map<String, dynamic> toJson() => {"type": type};

  @override
  String validate({
    @required BuildContext context,
    @required String label,
    @required String value,
  }) {
    if (value?.isNotEmpty == true && value.length < 6) {
      return 'Value must be at least 6 characters long';
    }
    return null;
  }
}

void main() {
  Validator.registerCustomValidatorBuilder(
    MyCustomValidator.type,
    MyCustomValidator.fromDynamic,
  );

  runApp(const MyApp());
}

// JSON 示例
var jsonStr = '''
{
  "validators": [{
    "type": "required"
  }, {
    "type": "my_custom_validator"
  }]
}
''';

var validator = Validator.fromDynamic(json.decode(jsonStr));

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 form_validation 插件进行表单验证:

import 'package:flutter/material.dart';
import 'package:form_floating_action_button/form_floating_action_button.dart';
import 'package:form_validation/form_validation.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(title: 'Validation Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
    required this.title,
  });
  final String title;

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _loading = false;

  void _onSubmit() async {
    setState(() => _loading = true);
    await Future.delayed(const Duration(seconds: 3));
    _loading = false;
    if (mounted == true) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      child: Builder(
        builder: (BuildContext context) => Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: SingleChildScrollView(
            padding: const EdgeInsets.symmetric(horizontal: 16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: [
                TextFormField(
                  decoration: const InputDecoration(
                    labelText: 'Required',
                  ),
                  validator: (value) {
                    final validator = Validator(
                      validators: [const RequiredValidator()],
                    );

                    return validator.validate(
                      label: 'Required',
                      value: value,
                    );
                  },
                ),
                const SizedBox(
                  height: 16.0,
                ),
                TextFormField(
                  decoration: const InputDecoration(
                    labelText: 'Email',
                  ),
                  validator: (value) {
                    final validator = Validator(
                      validators: [
                        const RequiredValidator(),
                        const EmailValidator(),
                      ],
                    );

                    return validator.validate(
                      label: 'Email',
                      value: value,
                    );
                  },
                ),
                const SizedBox(
                  height: 16.0,
                ),
                TextFormField(
                  decoration: const InputDecoration(
                    labelText: 'Min 3 / Max 5 Length',
                  ),
                  validator: (value) {
                    final validator = Validator(
                      validators: [
                        const MaxLengthValidator(length: 5),
                        const MinLengthValidator(length: 3),
                      ],
                    );

                    return validator.validate(
                      label: 'Min 3 / Max 5 Length',
                      value: value,
                    );
                  },
                ),
              ],
            ),
          ),
          floatingActionButton: FormFloatingActionButton(
            loading: _loading,
            onSubmit: _onSubmit,
            onValidate: () async {
              var error = false;

              try {
                final form = Form.of(context);

                error = form.validate();
              } catch (e) {
                // no-op
              }
              return error;
            },
          ),
        ),
      ),
    );
  }
}

以上代码展示了如何使用 form_validation 插件创建一个简单的表单,并对输入字段进行验证。希望这对你有所帮助!


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

1 回复

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


当然,以下是如何在Flutter中使用form_validation插件来进行表单验证的一个简单示例。这个插件提供了便捷的API来验证各种表单输入。

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

dependencies:
  flutter:
    sdk: flutter
  form_validation: ^0.0.20  # 请检查最新版本号

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

接下来,我们创建一个包含几个输入字段和验证逻辑的示例表单。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Form Validation Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: MyForm(),
        ),
      ),
    );
  }
}

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

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  late FormValidator _formValidator;

  @override
  void initState() {
    super.initState();
    _formValidator = FormValidator()
      ..addValidators([
        FieldValidator<String>.of('email')
          ..isRequired()
          ..isEmail(),
        FieldValidator<String>.of('password')
          ..isRequired()
          ..hasMinLength(6),
        FieldValidator<String>.of('confirmPassword')
          ..isRequired()
          ..isEqualTo('password')
      ]);
  }

  void _submitForm() {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      // Perform form submission
      print('Form submitted successfully!');
      // Example: You can navigate to another screen or process the data
    } else {
      // Validate the form
      _formValidator.validateFields(_formKey.currentState!).then((results) {
        results.forEach((fieldName, isValid) {
          if (!isValid) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('${fieldName.capitalize()} is invalid'),
                duration: Duration(seconds: 2),
              ),
            );
          }
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          TextFormField(
            decoration: InputDecoration(labelText: 'Email'),
            validator: (value) => _formValidator.validateField('email', value),
            onSaved: (value) => _formValidator.saveField('email', value),
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: (value) => _formValidator.validateField('password', value),
            onSaved: (value) => _formValidator.saveField('password', value),
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Confirm Password'),
            obscureText: true,
            validator: (value) => _formValidator.validateField('confirmPassword', value),
            onSaved: (value) => _formValidator.saveField('confirmPassword', value),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _submitForm,
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}

代码解释

  1. 依赖添加:在pubspec.yaml中添加form_validation依赖。

  2. 初始化FormValidator:在initState方法中初始化FormValidator对象,并添加所需的验证规则。

  3. 表单字段:使用TextFormField创建表单字段,并将validatoronSaved回调设置为使用_formValidator进行验证和保存。

  4. 表单提交:在_submitForm方法中,首先使用_formKey.currentState!.validate()来验证整个表单。如果表单验证通过,则保存表单数据并执行后续操作。如果验证失败,则使用_formValidator.validateFields方法来获取每个字段的验证结果,并显示相应的SnackBar消息。

这样,你就可以在Flutter中使用form_validation插件来方便地验证表单输入了。希望这个示例对你有所帮助!

回到顶部