Flutter表单验证插件vformfield的使用

Flutter表单验证插件vformfield的使用

验证规则(Validation Rules for Form Fields)

vformfield 插件提供了多种验证规则,可用于 Flutter 应用程序中的表单字段验证。

截图

入门指南(Getting Started)

要使用此插件,请在 pubspec.yaml 文件中添加 vformfield 作为依赖项。

dependencies:
  vformfield: ^版本号

使用说明(Usage)

创建用户名表单字段(create username VFormField)

以下是一个简单的示例,展示如何创建带有验证规则的用户名字段。

class UserName extends VFormField<String> {
  UserName({required super.value}) : super();
}

PasswordText passwordText = PasswordText(
  value: '',
  rulebuilder: () => [
    NotEmptyRule(), // 必填规则
    RegExRule(
        builder: (generator) => generator
            .contains('@') // 包含 '@'
            .endsWith([".ly", ".com"]) // 以 `.ly` 或 `.com` 结尾
            .maxLength(15) // 最大长度为 15
            .minLength(5), // 最小长度为 5
        errorRegex: 'error'), // 错误信息
  ],
);

UserName usernameText = UserName(
  value: '',
  rulebuilder: () => [
    NotEmptyRule(), // 必填规则
    RegExRule(
        builder: (generator) => generator
            .contains('@') // 包含 '@'
            .endsWith([".ly", ".com"]) // 以 `.ly` 或 `.com` 结尾
            .maxLength(15) // 最大长度为 15
            .minLength(5), // 最小长度为 5
        errorRegex: 'error'), // 错误信息
  ],
);

自定义验证正则表达式模式(Custom validation regular expression patterns)

可以使用自定义正则表达式来实现更复杂的验证逻辑。

usernameText.addRule(
  RegExRule(
      builder: (generator) => generator.contains('@')
        .endsWith([".ly", ".com"])
        .maxLength(15)
        .minLength(5),
      errorRegex: '请输入有效的电子邮件地址'),
).addRule(
  RegExRule(
      pattern: r'^[0-9]{8}$', // 示例规则
      errorRegex: '请输入有效的电话号码'),
).addRule(
  RegExRule(
      pattern: r'^[a-zA-Z]{5}$', // 示例规则
      errorRegex: '请输入有效的字母组合'),
);

使用正则表达式模式(Use regular expression patterns)

以下示例展示了如何使用正则表达式模式进行表单验证。

phoneNumberText.addRule(RegExRule(
    builder: (generator) => generator.addGroup(
        builder: (group) => group.startsWith("00218")
            .flowingBy([92, 91], count: 2) // 流动范围
            .addRange(0, 9, count: 7)), // 数字范围
    maxLength: 14,
    errorRegex: '无效的电话号码'),
).addRule(
  RegExRule(
      pattern: r'^[a-zA-Z]{5}$', // 示例规则
      errorRegex: '请输入有效的字母组合'),
);

TextFormField(
  obscureText: phoneNumberText.obscureText,
  validator: phoneNumberText.validator,
  initialValue: "",
  onChanged: (value) {
    phoneNumberText.validator(value);
    setState(() {});
  },
  decoration: InputDecoration(
    labelText: 'Phone Number',
    errorText: phoneNumberText.errorMessage,
  ),
),

使用 Builder(Use Builder)

可以通过 Builder 包裹表单字段,动态更新其状态。

passwordText.builder(
  builder: (context, value, message, obscure) => TextFormField(
    obscureText: passwordText.obscureText,
    validator: passwordText.validator,
    initialValue: value,
    onChanged: (value) {
      passwordText.validator(value);
    },
    decoration: InputDecoration(
      labelText: 'Password',
      errorText: passwordText.errorMessage,
      suffixIcon: IconButton(
        icon: Icon(
          passwordText.obscureText
              ? Icons.visibility
              : Icons.visibility_off,
          color: Theme.of(context).primaryColorDark,
        ),
        onPressed: () {
          passwordText.setobscures();
        },
      ),
    ),
  ),
),

创建自定义验证规则(Create Custom validation rules)

可以通过继承 ValidationRule 类来自定义验证规则。

class CustomRule<T> extends ValidationRule<T> {
  CustomRule()
      : super(
          validator: (value) {
            if (value == null || value.isEmpty) {
              return '值不能为空';
            }
            // 自定义验证逻辑
            return null;
          },
          errorMessage: '值无效',
        );
}

完整示例代码

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:vformfield/scr/validation_rule.dart';
import 'package:vformfield/vformfield.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'VFormField',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'VFormField'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late PasswordText passwordText;
  late UserName usernameText;
  late List<VFormField> form;

  [@override](/user/override)
  void initState() {
    passwordText = PasswordText(
      value: 'Init Password',
      rulebuilder: () => [
        RegExRule(pattern: r'^[0-9]+$', errorRegex: '仅允许数字'),
      ],
    );
    usernameText = UserName(
      value: 'init USer Name',
      rulebuilder: () => [
        NotEmptyRule(),
        RegExRule(
            builder: (generator) => generator
                .contains('@')
                .endsWith([".ly", ".com"])
                .maxLength(15)
                .minLength(5),
            errorRegex: '错误'),
      ],
    );
    super.initState();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('VFormField'),
            usernameText.builder(
              builder: (context, value, message, obscure) => TextFormField(
                obscureText: usernameText.obscureText,
                validator: usernameText.validator,
                initialValue: value,
                onChanged: (value) {
                  usernameText.validator(value);
                },
                decoration: InputDecoration(
                  labelText: '用户名',
                  errorText: usernameText.errorMessage,
                ),
              ),
            ),
            passwordText.builder(
              builder: (context, value, message, obscure) => TextFormField(
                obscureText: passwordText.obscureText,
                validator: passwordText.validator,
                initialValue: value,
                onChanged: (value) {
                  passwordText.validator(value);
                },
                decoration: InputDecoration(
                  labelText: '密码',
                  errorText: passwordText.errorMessage,
                  suffixIcon: IconButton(
                    icon: Icon(
                      passwordText.obscureText
                          ? Icons.visibility
                          : Icons.visibility_off,
                      color: Theme.of(context).primaryColorDark,
                    ),
                    onPressed: () {
                      passwordText.setobscures();
                    },
                  ),
                ),
              ),
            ),
            ElevatedButton(
              onPressed: () {
                for (var field in form) {
                  if (!field.status) {
                    log("错误");
                    setState(() {});
                    return;
                  }
                }
                log("提交数据");
              },
              child: const Text("提交"),
            ),
          ],
        ),
      ),
    );
  }
}

class PasswordText extends VFormField<String> {
  PasswordText({required super.value, required super.rulebuilder}) : super();
}

class UserName extends VFormField<String> {
  UserName({required super.value, required super.rulebuilder}) : super();
}

class CustomRule extends ValidationRule<String> {
  String? errormessage;
  CustomRule({this.errormessage})
      : super(
          validator: (value) {
            if (value == null || value.isEmpty) {
              return errormessage ?? '值不能为空';
            }
            // 自定义验证逻辑
            return null;
          },
        );
}

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

1 回复

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


VFormField 是一个用于 Flutter 表单验证的插件,它可以帮助开发者更方便地处理表单输入和验证。以下是如何使用 VFormField 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 vformfield 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  vformfield: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 vformfield 包:

import 'package:vformfield/vformfield.dart';

3. 使用 VFormField

VFormField 可以用于各种表单字段,如文本输入、选择框等。以下是一个简单的示例,展示如何使用 VFormField 进行文本输入验证:

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

class MyForm extends StatefulWidget {
  [@override](/user/override)
  _MyFormState createState() => _MyFormState();
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('VFormField Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              VFormField(
                labelText: 'Username',
                validator: (value) {
                  if (value.isEmpty) {
                    return 'Please enter your username';
                  }
                  return null;
                },
              ),
              SizedBox(height: 20),
              VFormField(
                labelText: 'Password',
                obscureText: true,
                validator: (value) {
                  if (value.isEmpty) {
                    return 'Please enter your password';
                  }
                  if (value.length < 6) {
                    return 'Password must be at least 6 characters';
                  }
                  return null;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState.validate()) {
                    // 表单验证通过,执行提交操作
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Form Submitted')),
                    );
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyForm(),
  ));
}
回到顶部