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 | 确保值是有效的电子邮件格式 | |
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
更多关于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'),
),
],
),
);
}
}
代码解释
-
依赖添加:在
pubspec.yaml
中添加form_validation
依赖。 -
初始化FormValidator:在
initState
方法中初始化FormValidator
对象,并添加所需的验证规则。 -
表单字段:使用
TextFormField
创建表单字段,并将validator
和onSaved
回调设置为使用_formValidator
进行验证和保存。 -
表单提交:在
_submitForm
方法中,首先使用_formKey.currentState!.validate()
来验证整个表单。如果表单验证通过,则保存表单数据并执行后续操作。如果验证失败,则使用_formValidator.validateFields
方法来获取每个字段的验证结果,并显示相应的SnackBar消息。
这样,你就可以在Flutter中使用form_validation
插件来方便地验证表单输入了。希望这个示例对你有所帮助!