Valform

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 创建。

GitHub

查看 Github