Valform
无样板代码的表单验证库。
为什么?
没有一种干净利落的方式来区分业务逻辑(验证)与呈现。
为什么不用 Formz?
Formz 违背了 Flutter 处理状态的方式,迫使用户将表单状态完全保留在业务逻辑中。
但在 Flutter 中无法做到这一点。状态不可避免地存储在 TextEditingControllers 中。格式化程序在小部件本身内部应用。
当我使用 formz 时,我总是发现自己复制粘贴表单输入项,并在简单的用例中遇到困难。
为什么选择 Valform?
- 极简。
- 完美契合 Flutter 的表单处理系统。
- 您的团队成员只需要了解几个简单的概念。
简单用法
用例:我们想验证电子邮件是否存在于我们的数据库中。如果存在,则显示错误。
对于这种情况,我将使用 VfReproduce,因为我想保留用户意外输入之前验证过的电子邮件时的错误。
class LoginFormState extends ChangeNotifier {
VfReproduce _emailAlreadyExists;
LoginFormState([
this._emailAlreadyExists = const VfReproduce.sealed()
]);
String? validateEmail(String? email) {
if (_emailAlreadyExists.access(email)) {
return "Email already exists";
}
return null;
}
Future<void> submit() {
await Future.delayed(Duration(seconds: 1)); // access the database
_emailAlreadyExists = VfReproduce();
notifyListeners();
}
}
在 Flutter 代码的某个地方
final loginFormState = LoginFormState();
void initState() {
super.initState();
loginFormState.addListener(() => setState(() {}));
}
Widget build(BuildContext context) => Column(
children: [
TextFormField(
validator: loginFormState.validateEmail,
),
OutlinedButton(onPressed: loginFormState.submit),
]
);
灵感来源
整个工作受到了 async_redux 中事件概念的启发,该包由 Marcelo Glasberg 创建。