form_validator_kit 0.1.0
form_validator_kit: ^0.1.0 copied to clipboard
A lightweight and composable Flutter form validation package with built-in validators for email, phone, password, regex, and more.
import 'package:flutter/material.dart';
import 'package:form_validator_kit/form_validator_kit.dart';
void main() {
runApp(const FormValidatorKitExampleApp());
}
class FormValidatorKitExampleApp extends StatelessWidget {
const FormValidatorKitExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'form_validator_kit example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF0F766E)),
useMaterial3: true,
),
home: const ExampleFormPage(),
);
}
}
class ExampleFormPage extends StatefulWidget {
const ExampleFormPage({super.key});
@override
State<ExampleFormPage> createState() => _ExampleFormPageState();
}
class _ExampleFormPageState extends State<ExampleFormPage> {
final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController();
final _emailController = TextEditingController();
final _phoneController = TextEditingController();
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
final _confirmPasswordController = TextEditingController();
final _websiteController = TextEditingController();
@override
void dispose() {
_nameController.dispose();
_emailController.dispose();
_phoneController.dispose();
_usernameController.dispose();
_passwordController.dispose();
_confirmPasswordController.dispose();
_websiteController.dispose();
super.dispose();
}
void _validate() {
final isValid = _formKey.currentState?.validate() ?? false;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
isValid ? 'Form is valid.' : 'Please fix the highlighted fields.',
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('form_validator_kit example')),
body: SafeArea(
child: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_ExampleField(
label: 'Name',
controller: _nameController,
validator: FormValidator.required(),
),
_ExampleField(
label: 'Email',
controller: _emailController,
keyboardType: TextInputType.emailAddress,
validator: FormValidator.combine([
FormValidator.required(message: 'Email is required.'),
FormValidator.email(),
]),
),
_ExampleField(
label: 'Phone',
controller: _phoneController,
keyboardType: TextInputType.phone,
validator: FormValidator.phone(),
),
_ExampleField(
label: 'Username',
controller: _usernameController,
validator: FormValidator.username(
minLength: 4,
maxLength: 16,
),
),
_ExampleField(
label: 'Password',
controller: _passwordController,
customField: PasswordInputField(
controller: _passwordController,
labelText: 'Password',
hintText: 'Create a secure password',
validator: FormValidator.required(),
minLength: 8,
requireUppercase: true,
requireLowercase: true,
requireNumber: true,
requireSpecialChar: true,
),
),
_ExampleField(
label: 'Confirm Password',
controller: _confirmPasswordController,
customField: PasswordInputField(
controller: _confirmPasswordController,
labelText: 'Confirm Password',
hintText: 'Re-enter your password',
validator: FormValidator.required(
message: 'Please confirm your password.',
),
matchController: _passwordController,
mismatchMessage: 'Passwords do not match.',
validateAgainstPolicy: false,
showStrengthIndicator: false,
),
),
_ExampleField(
label: 'Website',
controller: _websiteController,
keyboardType: TextInputType.url,
validator: FormValidator.url(allowEmpty: true),
),
const SizedBox(height: 20),
FilledButton(
onPressed: _validate,
child: const Text('Validate Form'),
),
],
),
),
),
),
);
}
}
class _ExampleField extends StatelessWidget {
const _ExampleField({
required this.label,
required this.controller,
this.validator,
this.customField,
this.keyboardType,
});
final String label;
final TextEditingController controller;
final ValidatorFunction? validator;
final Widget? customField;
final TextInputType? keyboardType;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child:
customField ??
TextFormField(
controller: controller,
keyboardType: keyboardType,
validator: validator,
decoration: InputDecoration(
labelText: label,
border: const OutlineInputBorder(),
),
),
);
}
}