Flutter表单验证插件super_validation的使用
Flutter表单验证插件super_validation的使用
使用
在 test_bloc.dart
文件中,你可以定义一个 SuperValidation
对象来处理字符串验证:
final SuperValidation validation = SuperValidation(validationFunc: (value) {
if (value == null || value.isEmpty) {
return '请输入一些文本';
}
return null;
});
对于整数或数字的验证,可以使用 SuperValidationInt
和 SuperValidationNum
类:
final SuperValidationInt intValidation = SuperValidationInt.minMax(
min: 0,
max: 10,
minMessage: '最小值为0',
maxMessage: '最大值为10',
);
final SuperValidationNum numValidation = SuperValidationNum.minMax(
min: 0,
max: 10,
minMessage: '最小值为0',
maxMessage: '最大值为10',
);
对于枚举类型的验证,可以使用 SuperValidationEnum
类:
enum TestEnum { one, two, three }
final SuperValidationEnum<TestEnum> enumValidation = SuperValidationEnum()
..validation = '请选择一个选项';
// 在 `test_page.dart` 文件中使用
DropDownEnumField<TestEnum>(
superValidation: context.read<TestBloc>().enumValidation,
items: TestEnumM.mapName,
autovalidateMode: AutovalidateMode.always,
),
在 test_page.dart
文件中,你可以使用 TextFieldSuperValidation
来添加带有验证功能的文本字段:
TextFieldSuperValidation(
superValidation: context.read<TestBloc>().validation,
autovalidateMode: AutovalidateMode.onUserInteraction,
);
如果你想要自定义错误装饰图标或后缀,可以使用 TextFieldSuperValidationWithIcon
:
TextFieldSuperValidationWithIcon(
superValidation: superValidation,
errorIcon: Icon(Icons.error, color: Colors.red, size: 20),
errorSuffix: Icon(Icons.error, color: Colors.red, size: 20),
);
你还可以强制设置验证文本:
validation.validate('验证文本');
设置文本字段的内容:
validation.text = event.text;
构建按钮时,可以使用 SuperValidationBuilder
:
SuperValidationBuilder(
superValidation: context.read<TestBloc>().validation,
builder: (context, validation, isValid) {
return TextButton(
onPressed: isValid
? () {
print('测试');
}
: null,
child: Text('测试'));
});
使用 SuperValidationSimpleMultyBuilder
可以实现多个验证条件的按钮:
SuperValidationSimpleMultyBuilder(
builder: (context, isValid) {
return ElevatedButton(
onPressed: isValid
? () {
print('按下');
}
: null,
child: Text('验证'),
);
},
superValidation: [
context.read<TestBloc>().numberValidation,
context.read<TestBloc>().stringValidation,
],
)
使用 SuperValidationMultyBuilder
可以实现多个验证条件的按钮,并且可以自定义验证文本:
SuperValidationMultyBuilder(
builder: (context, validation, isValid) {
return Text(
validation.isEmpty ? '有效' : validation.toString(),
style: TextStyle(
color: isValid ? Colors.green : Colors.red,
),
);
},
superValidation: {
'string': context.read<TestBloc>().stringValidation,
'number': context.read<TestBloc>().numberValidation,
},
)
如果需要自定义逻辑,可以在 bloc 中使用 SuperValidationStream
:
final SuperValidationStream<String> superValidationStream =
SuperValidationStream(
superValidationMap: {
'string': context.read<TestBloc>().stringValidation,
'number': context.read<TestBloc>().numberValidation,
},
);
superValidationStream.streamValidation.listen((event) {
print('验证结果: $event');
});
自定义验证示例:
class SuperValidationFile extends SuperValidationA {
SuperValidationFile() {
validate();
}
void validate() {
if (files.length != 2) {
validation = '你需要添加两个文件';
} else {
validation = null;
}
}
final StreamController<String?> _streamController = StreamController.broadcast();
@override
Stream<bool> get streamIsValid => _streamController.stream.map((event) => event == null);
@override
Stream<String?> get streamValidation => _streamController.stream;
String? _validation;
@override
String? get validation => _validation;
set validation(String? value) {
_validation = value;
_streamController.add(value);
}
List<FileManaged> _files = [];
List<FileManaged> get files => [..._files];
void addFile(FileManaged file) {
_files.add(file);
validate();
}
void removeFile(FileManaged file) {
_files.remove(file);
validate();
}
}
使用 SuperValidationEnumBuilder
可以实现枚举类型的流构建器:
SuperValidationEnumBuilder<String>(
superValidation: superValidation,
builder: (context, value) {
return ListView(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
children: values
.map((e) => CheckboxListTile(
title: Text(e),
value: value == e,
onChanged: (value) {
if (value == true) {
superValidation.value = e;
}
},
))
.toList(),
);
});
使用 SuperValidationTextFieldListener
可以实现枚举类型到文本字段的转换:
SuperValidationTextFieldListener<String>(
transformer: (val) => val,
readOnly: true,
superValidation:
context.read<TestBloc>().stringEnumValidation),
更多关于Flutter表单验证插件super_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter表单验证插件super_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用super_validation
插件进行表单验证的示例代码。super_validation
是一个强大的表单验证库,可以帮助你轻松地在Flutter中实现复杂的表单验证逻辑。
首先,确保你已经在pubspec.yaml
文件中添加了super_validation
依赖:
dependencies:
flutter:
sdk: flutter
super_validation: ^最新版本号 # 请替换为当前最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们创建一个简单的Flutter应用,其中包含一个登录表单,并使用super_validation
进行验证。
import 'package:flutter/material.dart';
import 'package:super_validation/super_validation.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: LoginScreen(),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final formKey = GlobalKey<FormState>();
late ValidationController validationController;
@override
void initState() {
super.initState();
validationController = ValidationController(
validators: {
'email': MultiValidator([
RequiredValidator(errorText: 'Email is required'),
EmailValidator(errorText: 'Invalid email format'),
]),
'password': MultiValidator([
RequiredValidator(errorText: 'Password is required'),
MinLengthValidator(6, errorText: 'Password must be at least 6 characters long'),
]),
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Login'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: formKey,
child: Column(
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Email'),
validator: (value) {
validationController.validateField('email', value);
return validationController.getErrorText('email');
},
onChanged: (value) {
validationController.updateField('email', value);
},
),
SizedBox(height: 16),
TextFormField(
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (value) {
validationController.validateField('password', value);
return validationController.getErrorText('password');
},
onChanged: (value) {
validationController.updateField('password', value);
},
),
SizedBox(height: 24),
ElevatedButton(
onPressed: () {
if (formKey.currentState!.validate()) {
// If form is valid, you can perform your login action here
print('Form is valid, proceed with login');
}
},
child: Text('Login'),
),
],
),
),
),
);
}
@override
void dispose() {
validationController.dispose();
super.dispose();
}
}
在这个示例中,我们做了以下几件事:
- 创建一个
ValidationController
实例,并定义了两个字段(email
和password
)的验证规则。 - 在
TextFormField
的validator
回调中,调用validationController.validateField
方法进行验证,并返回相应的错误信息。 - 在
TextFormField
的onChanged
回调中,调用validationController.updateField
方法更新字段值,这样验证状态会实时更新。 - 在表单提交按钮的
onPressed
回调中,调用formKey.currentState!.validate()
来验证整个表单。如果表单验证通过,你可以执行相应的登录操作。
注意,super_validation
插件提供了丰富的验证器,如RequiredValidator
、EmailValidator
、MinLengthValidator
等,你可以根据需求自由组合这些验证器。