Flutter表单验证插件flutter_laravel_form_validation的使用

Flutter表单验证插件flutter_laravel_form_validation的使用

Flutter Laravel Form Validation 是一个基于Dart扩展的简化版Flutter表单验证库,灵感来源于Laravel验证。

🎖 安装

pubspec.yaml文件中添加依赖:

dependencies:
  flutter_laravel_form_validation: ^1.0.4

然后运行flutter pub get来安装包。

⚡️ 导入

在Dart文件中导入此库:

import 'package:flutter_laravel_form_validation/flutter_laravel_form_validation.dart';

🎮 使用方法

验证规则列表(短形式,无标签或自定义消息)

直接在TextFormField中使用字符串列表作为验证器:

TextFormField(
    validator : ['required','max:10','uppercase'].v,
),

或者使用FLValidator类的方法:

TextFormField(
    validator : [FLValidator.required, FLValidator.max(10), FLValidator.uppercase].v,
),

自定义验证函数

可以将自定义验证函数与内置验证器一起使用:

TextFormField(
    validator : [FLValidator.required, customValidation].v,
),

String? customValidation(String? value) {
    if (value == "flutterdev") {
        return "Value cannot be flutterdev";
    }
    return null;
}

字符串形式的验证规则(短形式,无标签或自定义消息)

可以直接用管道符号分隔的字符串表示多个验证规则:

TextFormField(
    validator : "required|max:10|uppercase".v,
),

带有标签或自定义消息的验证规则列表

可以在验证时指定字段名称和自定义错误信息:

TextFormField(
    validator : ['required', 'max:10', 'uppercase'].validate(
        attribute: 'Username',
        customMessages: {
            'required': "You must input your username",
            'max': "The length must be 10",
            'uppercase': "Only uppercase is allowed"
        },
    ),
),

也可以对字符串形式的验证规则做同样的处理:

TextFormField(
    validator : "required|max:10|uppercase".validate(
        attribute: 'Username',
        customMessages: {
            'required': "You must input your username",
            'max': "The length must be 10",
            'uppercase': "Only uppercase is allowed"
        },
    ),
),

规则列表

以下是部分可用的验证规则及其示例:

类属性 字符串 描述 示例
FLValidator.required required 确保字段值是必填项 ['required']'required'[FLValidator.required]
FLValidator.numeric numeric 确保字段值是数字 ['numeric']'numeric'[FLValidator.numeric]

更多规则请参见原文档表格。

示例代码

以下是一个完整的示例应用,展示了如何使用flutter_laravel_form_validation进行表单验证:

import 'package:flutter/material.dart';
import 'package:flutter_laravel_form_validation/extensions/extensions.dart';
import 'package:flutter_laravel_form_validation/flutter_laravel_form_validation.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late GlobalKey<FormState> formKey;
  var _autoValidateMode = AutovalidateMode.disabled;

  @override
  void initState() {
    super.initState();
    formKey = GlobalKey<FormState>();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        padding: const EdgeInsets.all(40.0),
        child: Form(
          autovalidateMode: _autoValidateMode,
          key: formKey,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextFormField(
                key: const Key("username"),
                validator: [
                  FLValidator.required,
                  FLValidator.max(10),
                  FLValidator.email,
                  FLValidator.uppercase,
                  FLValidator.same("man"),
                ].validate(attribute: "Username fullname"),
              ),
              const SizedBox(height: 10),
              TextFormField(
                key: const Key("customval"),
                decoration: const InputDecoration(hintText: "Custom validation"),
                validator: [FLValidator.required, customValidation].v,
              ),
              const SizedBox(height: 10),
              TextFormField(
                key: const Key("email"),
                validator: 'required|email'.v,
              ),
              const SizedBox(height: 10),
              TextFormField(
                key: const Key("fullname"),
                validator: ['required', 'uppercase'].v,
              ),
              const SizedBox(height: 10),
              ElevatedButton(
                onPressed: handleSubmit,
                child: const Text("Submit"),
              )
            ],
          ),
        ),
      ),
    );
  }

  void handleSubmit() {
    final formState = formKey.currentState;
    if (formState == null) {
      return;
    }
    if (!formState.validate()) {
      setState(() {
        _autoValidateMode = AutovalidateMode.always;
      });
    } else {
      // 表单验证通过后的逻辑
    }
  }
}

// 自定义验证函数
String? customValidation(String? value) {
  if (value == "flutterdev") {
    return "Value cannot be flutterdev";
  }
  return null;
}

以上就是关于flutter_laravel_form_validation的基本介绍和使用方法。如果有任何问题或建议,欢迎随时提出!


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

1 回复

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


当然,以下是如何在Flutter中使用flutter_laravel_form_validation插件进行表单验证的一个示例。这个插件允许你将Laravel风格的验证规则应用到Flutter表单中。

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

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

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

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

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Laravel Form Validation Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: FormValidationDemo(),
        ),
      ),
    );
  }
}

class FormValidationDemo extends StatefulWidget {
  @override
  _FormValidationDemoState createState() => _FormValidationDemoState();
}

class _FormValidationDemoState extends State<FormValidationDemo> {
  final formKey = GlobalKey<FormState>();
  final TextEditingController nameController = TextEditingController();
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: formKey,
      child: Column(
        children: [
          TextFormField(
            controller: nameController,
            decoration: InputDecoration(labelText: 'Name'),
            validator: (value) {
              if (value.isEmpty || value.length < 3) {
                return 'Name must be at least 3 characters long';
              }
              return null;
            },
          ),
          TextFormField(
            controller: emailController,
            decoration: InputDecoration(labelText: 'Email'),
            validator: (value) {
              // 使用 flutter_laravel_form_validation 提供的验证器
              final validator = LaravelValidator(rules: {
                'email': 'required|email',
              });
              final result = validator.validate({'email': value});
              if (result.isNotEmpty) {
                return result.first;
              }
              return null;
            },
          ),
          TextFormField(
            controller: passwordController,
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: (value) {
              if (value.isEmpty || value.length < 6) {
                return 'Password must be at least 6 characters long';
              }
              return null;
            },
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () async {
              if (formKey.currentState!.validate()) {
                // 可以在这里添加提交表单的逻辑
                print('Form submitted');
                print('Name: ${nameController.text}');
                print('Email: ${emailController.text}');
                print('Password: ${passwordController.text}');
              } else {
                // 使用 flutter_laravel_form_validation 提供的全局验证
                final globalValidator = LaravelValidator(rules: {
                  'name': 'required|min:3',
                  'email': 'required|email',
                  'password': 'required|min:6',
                });
                final globalResults =
                    globalValidator.validate({
                  'name': nameController.text,
                  'email': emailController.text,
                  'password': passwordController.text,
                });
                if (globalResults.isNotEmpty) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(
                      content: Text(globalResults.first),
                    ),
                  );
                }
              }
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    nameController.dispose();
    emailController.dispose();
    passwordController.dispose();
    super.dispose();
  }
}

在这个示例中:

  1. 我们创建了一个简单的Flutter表单,包含名称、电子邮件和密码字段。
  2. 对于电子邮件字段,我们使用了flutter_laravel_form_validation插件提供的验证器来进行验证。
  3. 在提交按钮的点击事件中,我们首先使用Flutter内置的表单验证,然后使用flutter_laravel_form_validation插件提供的全局验证器进行二次验证。

注意:这个插件的API可能会随着版本的更新而变化,因此请参考最新的文档和示例代码。

回到顶部