Universal Validator

pub package popularity likes pub points

A comprehensive Flutter package providing reusable form validators, smart input widgets, and formatting utilities. Reduce boilerplate code and ensure consistent validation across your Flutter applications.

✨ Features

  • 🔍 Pre-built Validators: Email, phone, password, name, PAN, GST, and more
  • 🎯 Smart Widgets: Input fields with built-in validation and formatting
  • 🌍 International Support: Phone numbers, email formats, and localization
  • Real-time Validation: Debounced validation with customizable timing
  • 🎨 Customizable: Custom error messages, validation rules, and formatting
  • 📱 Cross-platform: Works on iOS, Android, Web, and Desktop
  • 🧪 Well Tested: Comprehensive test coverage with property-based testing

📦 Installation

Add this to your package's pubspec.yaml file:

dependencies:
  universal_validator: ^1.0.3

Then run:

flutter pub get

🚀 Quick Start

Basic Validators

import 'package:universal_validator/universal_validator.dart';

// Email validation
String? emailError = EmailValidator.validate('user@example.com');
print(emailError); // null (valid)

// Phone validation (supports international formats)
String? phoneError = PhoneValidator.validate('+919876543210');
print(phoneError); // null (valid)

// Password validation
String? passwordError = PasswordValidator.validate('MySecure123!');
print(passwordError); // null (valid)

Indian Documents Validation

// Aadhaar validation
print(AadhaarValidator.validate('9999 9999 0026')); // null (valid)

// IFSC validation
print(IFSCValidator.validate('HDFC0000123')); // null (valid)

// UPI ID validation
print(UPIIDValidator.validate('user@bank')); // null (valid)

// Vehicle Number validation
print(VehicleNumberValidator.validate('MH12AB1234')); // null (valid)

Smart Text Fields

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

class MyForm extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        // Email field with built-in validation
        UTextField(
          fieldType: FieldType.email,
          decoration: InputDecoration(
            labelText: 'Email',
            hintText: 'Enter your email',
          ),
          onValidationChanged: (result) {
            print('Email valid: ${result.isValid}');
          },
        ),
        
        // Phone field with formatting
        UTextField(
          fieldType: FieldType.phone,
          decoration: InputDecoration(
            labelText: 'Phone Number',
            hintText: 'Enter phone number',
          ),
          showSuccessIndicator: true,
        ),
        
        // Password field with strength validation
        UTextField(
          fieldType: FieldType.password,
          decoration: InputDecoration(
            labelText: 'Password',
            hintText: 'Enter a strong password',
          ),
          obscureText: true,
        ),
      ],
    );
  }
}

📋 Supported Validators

Validator Description Example
EmailValidator RFC-compliant email validation user@domain.com
PhoneValidator International & Indian phone numbers +919876543210, 9876543210
PasswordValidator Configurable password strength MySecure123!
NameValidator Names with cultural character support John Doe, Mary-Jane
PANValidator Indian PAN card format ABCDE1234F
GSTValidator Indian GST number with checksum 22AAAAA0000A1ZC
AadhaarValidator Indian Aadhaar number with Verhoeff checksum 9999 9999 0026
IFSCValidator Indian Financial System Code HDFC0000123
UPIIDValidator Unified Payments Interface ID user@bank
VehicleNumberValidator Indian Vehicle Registration Number MH12AB1234

🎯 Smart Widgets

UTextField

A powerful text field widget with built-in validation and formatting:

UTextField(
  fieldType: FieldType.email,
  enableRealTimeValidation: true,
  validationDebounce: Duration(milliseconds: 300),
  showSuccessIndicator: true,
  customErrorMessages: {
    'email': 'Please enter a valid email address',
  },
  onValidationChanged: (ValidationResult result) {
    // Handle validation state changes
    if (result.isValid) {
      print('Input is valid!');
    } else {
      print('Error: ${result.errorMessage}');
    }
  },
)

Field Types

enum FieldType {
  email,    // Email addresses
  phone,    // Phone numbers (international/Indian)
  password, // Passwords with strength validation
  name,     // Person names
  pan,      // Indian PAN cards
  gst,      // Indian GST numbers
  aadhaar,  // Indian Aadhaar numbers
  ifsc,     // Indian Financial System Codes
  upi,      // UPI IDs
  vehicleNumber, // Indian Vehicle numbers
  custom,   // Custom validation rules
}

⚙️ Advanced Configuration

Custom Password Validation

final passwordConfig = PasswordConfig(
  minLength: 12,
  requireUppercase: true,
  requireLowercase: true,
  requireNumbers: true,
  requireSpecialChars: true,
  forbiddenPasswords: ['password123', 'admin'],
);

UTextField(
  fieldType: FieldType.password,
  configuration: FieldConfiguration(
    parameters: {'passwordConfig': passwordConfig},
  ),
)

Custom Validation Rules

UTextField(
  fieldType: FieldType.custom,
  configuration: FieldConfiguration(
    customRules: [
      ValidationRule(
        name: 'minLength',
        validator: (value) => value?.length >= 5,
        errorMessage: 'Must be at least 5 characters',
        priority: 1,
      ),
      ValidationRule(
        name: 'noSpaces',
        validator: (value) => !value?.contains(' ') ?? true,
        errorMessage: 'Spaces are not allowed',
        priority: 2,
      ),
    ],
  ),
)

Input Formatting

// Phone number formatting
String formatted = PhoneFormatter.format('9876543210');
print(formatted); // "98765 43210"

// Name formatting (title case)
String formattedName = NameFormatter.format('john doe');
print(formattedName); // "John Doe"

// PAN formatting (uppercase)
String formattedPAN = PANFormatter.format('abcde1234f');
print(formattedPAN); // "ABCDE1234F"

🌍 Internationalization

Phone Number Support

// Indian numbers
PhoneValidator.validate('9876543210'); // ✅ Valid
PhoneValidator.validate('+919876543210'); // ✅ Valid

// US numbers
PhoneValidator.validate('+12345678901'); // ✅ Valid

// UK numbers
PhoneValidator.validate('+441234567890'); // ✅ Valid

Custom Error Messages

UTextField(
  fieldType: FieldType.email,
  customErrorMessages: {
    'email': 'कृपया एक वैध ईमेल पता दर्ज करें', // Hindi
    'required': 'यह फ़ील्ड आवश्यक है',
  },
)

🧪 Testing

The package includes comprehensive property-based tests to ensure reliability:

# Run all tests
flutter test

# Run specific validator tests
flutter test test/email_validator_property_test.dart
flutter test test/phone_validator_property_test.dart

📱 Platform Support

Platform Support
Android
iOS
Web
macOS
Windows
Linux

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

📞 Support


Made with ❤️ by Dhairya Soni

Libraries

universal_validator
Universal Validator - A comprehensive Flutter package for form validation