Flutter表单验证插件palace_validators的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter表单验证插件palace_validators的使用

Queen Palace 🏰👑 的一部分

Palace Validators

动机

  • 需要通过一些规则来验证请求体,并以简单且易读的方式进行。
  • 受到 class-validators 的启发,我们构建了这个包来解决这个问题。

内容

  • 提供一个辅助函数 List<String> validateDto(OBject o),该函数基于 queen_validators 包中的装饰器来验证DTO。
  • 提供 queen_validators 包中的验证规则。

示例

class GoodDto {
  @MinLength(5)
  @MaxLength(200)
  final String name = 'queen';

  @MinLength(5)
  @MaxLength(200)
  final String address = 'kingdom palace';

  @IsEmail()
  final String email = 'queen@royal.kingdom';
}

final failedRules = validateDto(GoodDto());
if (failedRules.isEmpty) {
   // * DTO验证成功
} else {
   // * DTO有一个或多个验证失败的规则
   failedRules.forEach(print);
   // 失败结果将被格式化如下
   /// `$fieldName ${rule.errorMsg}`
   /// 例如,如果email字段不满足条件
   /// `email 不是有效的电子邮件地址`
}

注意事项

Queen核心包负责从请求体实例化DTO。

final SignInDto dtoInstance = buildDto<SignInDto>({'email': 'queen@Royal.kingdom'});
print(dtoInstance is SignInDto); // true
print(dtoInstance.email); // queen@Royal.kingdom

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用palace_validators插件进行表单验证的示例代码。这个插件提供了一系列方便的方法来进行常见的表单验证,比如验证邮箱、密码强度、是否为空等。

首先,确保你已经在pubspec.yaml文件中添加了palace_validators依赖:

dependencies:
  flutter:
    sdk: flutter
  palace_validators: ^latest_version  # 请替换为最新的版本号

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

接下来是一个完整的示例,展示了如何使用palace_validators进行表单验证:

import 'package:flutter/material.dart';
import 'package:palace_validators/palace_validators.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Form Validation 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>();
  String _email = '';
  String _password = '';
  String _errorMessage = '';

  @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: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (!EmailValidator().isValid(value)) {
                    return 'Please enter a valid email address.';
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _email = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  if (value.length < 8) {
                    return 'Password must be at least 8 characters long.';
                  }
                  if (!PasswordValidator().hasUpperCase(value)) {
                    return 'Password must contain at least one uppercase letter.';
                  }
                  if (!PasswordValidator().hasLowerCase(value)) {
                    return 'Password must contain at least one lowercase letter.';
                  }
                  if (!PasswordValidator().hasNumber(value)) {
                    return 'Password must contain at least one number.';
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _password = value;
                  });
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // Perform submit action, e.g., navigate to next screen
                    _errorMessage = '';
                    // For demonstration purposes, just print the values
                    print('Email: $_email');
                    print('Password: $_password');
                  } else {
                    setState(() {
                      _errorMessage = 'Please correct the form errors.';
                    });
                  }
                },
                child: Text('Submit'),
              ),
              Text(_errorMessage, style: TextStyle(color: Colors.red)),
            ],
          ),
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖导入:在pubspec.yaml中添加palace_validators依赖。
  2. 全局键:使用GlobalKey<FormState>()来跟踪表单状态。
  3. TextFormField
    • Email:使用EmailValidator().isValid(value)来验证邮箱格式。
    • Password:使用PasswordValidator的多个方法来验证密码强度,包括长度、大小写字母和数字。
  4. 表单提交:在ElevatedButtononPressed回调中,调用_formKey.currentState!.validate()来验证表单。如果验证通过,执行提交操作;否则,显示错误信息。

这个示例展示了如何使用palace_validators插件来简化表单验证过程,提高代码的可读性和维护性。

回到顶部