Flutter表单验证插件easy_forms_validation的使用

Flutter表单验证插件easy_forms_validation的使用

easy_forms_validation 是一个Dart库,它允许在Flutter应用程序中轻松地将表单验证逻辑从UI层分离出来。它提供了一种简单且模块化的方式来验证表单数据并管理表单字段验证状态,从而使代码更加可维护和有组织。

FormPart

FormPart 表示可以被验证的表单的一部分。它可以是一个字段、一组字段或整个表单。

要验证任何表单部分,请使用 bool validate() 方法。

FormControllerMixin

FormControllerMixin 是一个 FormPart,代表由字段或其他表单构建的表单。它负责对每个字段进行验证。

示例:

// 定义邮箱验证错误类型
enum EmailValidationError { invalidFormat, alreadyUsed }

// 定义密码验证错误类型
enum PasswordValidationError { tooShort }

// 创建登录表单类
class LoginForm with FormControllerMixin {
  // 邮箱字段控制器
  final email = TextFieldController(
    initialValue: '', // 初始值为空字符串
    validator: (value, _) {
      // 自定义验证逻辑
      if (value.isEmpty || !value.contains('@')) {
        return EmailValidationError.invalidFormat; // 返回错误类型
      }
      return null; // 验证通过
    },
  );
  
  // 密码字段控制器
  final password = TextFieldController(
    initialValue: '', // 初始值为空字符串
    validator: (value, _) {
      // 自定义验证逻辑
      if (value.length < 6) {
        return PasswordValidationError.tooShort; // 返回错误类型
      }
      return null; // 验证通过
    },
  );

  // 同意条款的布尔值字段控制器
  final consent = BoolFieldController();

  // 获取所有需要验证的字段列表
  [@override](/user/override)
  List<FormPart<FormPartState>> get fields => [email, password, consent];
}

FieldController

FieldController 是一个 FormPart,表示表单中的一个字段。

预定义的字段控制器类型包括:

  • TextFieldController - 用于与 TextFieldBuilder 结合控制文本字段
  • BoolFieldController - 用于字段值为 bool 类型
  • SelectFieldController - 用于具有预定义选项的字段,例如下拉菜单
  • MultiSelectFieldController - 用于支持选择多个预定义选项的字段

Extensions

这些混入不需要作为 FormControllerMixin 的一部分。它们都需要实现 FormController get form 获取器。

  • FormValueMixin - 当你想表示整个经过验证的表单作为一个单一值(对象)时使用。
  • SubmitFormMixin - 当你想向表单添加提交逻辑时使用。

示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';

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

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

  // 这个小部件是你的应用的根
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const LoginPage(),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用easy_forms_validation插件进行表单验证的一个代码示例。这个插件简化了表单字段的验证过程,使得开发者可以更容易地实现复杂的验证逻辑。

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

dependencies:
  flutter:
    sdk: flutter
  easy_forms_validation: ^x.y.z  # 请替换为最新版本号

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

接下来,我们创建一个简单的表单,并使用easy_forms_validation来进行验证。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:easy_forms_validation/easy_forms_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: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  final _nameController = TextEditingController();
  final _emailController = TextEditingController();
  final _passwordController = TextEditingController();

  @override
  void dispose() {
    _nameController.dispose();
    _emailController.dispose();
    _passwordController.dispose();
    super.dispose();
  }

  final _validators = {
    'name': [
      Validators.required('Name is required'),
      Validators.minLength(3, 'Name must be at least 3 characters long'),
    ],
    'email': [
      Validators.required('Email is required'),
      Validators.email('Email is not valid'),
    ],
    'password': [
      Validators.required('Password is required'),
      Validators.minLength(6, 'Password must be at least 6 characters long'),
    ],
  };

  void _submitForm() {
    final form = _formKey.currentState;
    if (form!.validate()) {
      form.save();
      // 处理表单提交逻辑,例如发送到服务器
      print('Form submitted successfully');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Form Validation Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                controller: _nameController,
                decoration: InputDecoration(labelText: 'Name'),
                validator: (value) =>
                    ValidationService.validateField('name', value, _validators),
              ),
              TextFormField(
                controller: _emailController,
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) =>
                    ValidationService.validateField('email', value, _validators),
              ),
              TextFormField(
                controller: _passwordController,
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) =>
                    ValidationService.validateField('password', value, _validators),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _submitForm,
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 添加依赖:在pubspec.yaml文件中添加了easy_forms_validation依赖。
  2. 定义验证规则:在_validators映射中定义了每个字段的验证规则。
  3. 创建表单:使用FormTextFormField创建了一个简单的表单。
  4. 表单验证:在TextFormFieldvalidator属性中使用了ValidationService.validateField方法来应用验证规则。
  5. 提交表单:在点击提交按钮时,调用_submitForm方法来验证表单并处理提交逻辑。

这个示例展示了如何使用easy_forms_validation插件来简化表单验证过程,希望对你有所帮助。如果你有更具体的问题或需要进一步的定制,请随时提问。

回到顶部