Skip to main content

bharatvalidator 1.0.0 copy "bharatvalidator: ^1.0.0" to clipboard
bharatvalidator: ^1.0.0 copied to clipboard

🇮🇳 India-first Flutter form validation package with 30+ validators. Covers Aadhaar, PAN, GST, IFSC, UPI, Driving License, Passport, Voter ID, CIN, TAN, FSSAI, ABHA, EPF, Card (Luhn), MICR, RERA, Udy [...]

example/lib/main.dart

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

void main() => runApp(const BharatValidatorExampleApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'BharatValidator Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: const Color(0xFFFF6B00),
          primary: const Color(0xFFFF6B00),
        ),
        useMaterial3: true,
        inputDecorationTheme: InputDecorationTheme(
          border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
          contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
        ),
      ),
      home: const ValidatorDemoPage(),
    );
  }
}

class ValidatorDemoPage extends StatefulWidget {
  const ValidatorDemoPage({super.key});

  @override
  State<ValidatorDemoPage> createState() => _ValidatorDemoPageState();
}

class _ValidatorDemoPageState extends State<ValidatorDemoPage> {
  final _formKey = GlobalKey<FormState>();
  BharatLocale _locale = BharatLocale.english;
  late BharatValidator _v;

  final _name           = TextEditingController();
  final _phone          = TextEditingController();
  final _email          = TextEditingController();
  final _password       = TextEditingController();
  final _username       = TextEditingController();
  final _dob            = TextEditingController();
  final _aadhaar        = TextEditingController();
  final _pan            = TextEditingController();
  final _voterId        = TextEditingController();
  final _passport       = TextEditingController();
  final _drivingLicense = TextEditingController();
  final _gst            = TextEditingController();
  final _tan            = TextEditingController();
  final _cin            = TextEditingController();
  final _fssai          = TextEditingController();
  final _udyam          = TextEditingController();
  final _rera           = TextEditingController();
  final _ifsc           = TextEditingController();
  final _upi            = TextEditingController();
  final _bankAccount    = TextEditingController();
  final _cardNumber     = TextEditingController();
  final _micr           = TextEditingController();
  final _epf            = TextEditingController();
  final _amount         = TextEditingController();
  final _landline       = TextEditingController();
  final _abha           = TextEditingController();
  final _pincode        = TextEditingController();
  final _vehicle        = TextEditingController();
  final _url            = TextEditingController();
  final _otp            = TextEditingController();

  @override
  void initState() {
    super.initState();
    _v = BharatValidator(locale: _locale);
  }

  void _changeLocale(BharatLocale locale) {
    setState(() {
      _locale = locale;
      _v = BharatValidator(locale: locale);
    });
  }

  @override
  void dispose() {
    for (final c in [
      _name, _phone, _email, _password, _username, _dob,
      _aadhaar, _pan, _voterId, _passport, _drivingLicense,
      _gst, _tan, _cin, _fssai, _udyam, _rera,
      _ifsc, _upi, _bankAccount, _cardNumber, _micr, _epf, _amount,
      _landline, _abha, _pincode, _vehicle, _url, _otp,
    ]) {
      c.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('🇮🇳 BharatValidator Demo'),
        backgroundColor: Theme.of(context).colorScheme.primary,
        foregroundColor: Colors.white,
        actions: [
          PopupMenuButton<BharatLocale>(
            icon: const Icon(Icons.language),
            tooltip: 'Change Language',
            onSelected: _changeLocale,
            itemBuilder: (_) => const [
              PopupMenuItem(value: BharatLocale.english,  child: Text('🇬🇧 English')),
              PopupMenuItem(value: BharatLocale.hindi,    child: Text('🇮🇳 Hindi')),
              PopupMenuItem(value: BharatLocale.gujarati, child: Text('🟠 Gujarati')),
            ],
          ),
        ],
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              const _SectionHeader('👤 Personal Info'),
              _field('Full Name',     _name,     _v.name,     hint: 'Rahul Sharma'),
              _field('Username',      _username, _v.username, hint: 'rahul_123'),
              _field('Mobile Number', _phone,    _v.phone,    hint: '9876543210', keyboard: TextInputType.phone),
              _field('Landline',      _landline, _v.landline, hint: '02212345678', keyboard: TextInputType.phone),
              _field('Email',         _email,    _v.email,    hint: 'rahul@gmail.com', keyboard: TextInputType.emailAddress),
              _field('Password',      _password, _v.password, hint: 'Min 8 chars, A-z, 0-9, symbol', obscure: true),
              _field('Date of Birth', _dob,      (v) => _v.dob(v, minAge: 18), hint: 'DD/MM/YYYY'),

              const SizedBox(height: 16),
              const _SectionHeader('🪪 Government IDs'),
              _field('Aadhaar Number',  _aadhaar,        _v.aadhaar,        hint: '2345 6789 0123', keyboard: TextInputType.number),
              _field('PAN Number',      _pan,            _v.pan,            hint: 'ABCDE1234F'),
              _field('Voter ID',        _voterId,        _v.voterId,        hint: 'ABC1234567'),
              _field('Passport Number', _passport,       _v.passport,       hint: 'A1234567'),
              _field('Driving License', _drivingLicense, _v.drivingLicense, hint: 'GJ0120200123456'),

              const SizedBox(height: 16),
              const _SectionHeader('🏢 Tax & Business'),
              _field('GST Number',    _gst,   _v.gst,   hint: '27AAPFU0939F1ZV'),
              _field('TAN Number',    _tan,   _v.tan,   hint: 'PDES03028F'),
              _field('CIN Number',    _cin,   _v.cin,   hint: 'U67190TN2014PTC096978'),
              _field('FSSAI License', _fssai, _v.fssai, hint: '12345678901234', keyboard: TextInputType.number),
              _field('Udyam Number',  _udyam, _v.udyam, hint: 'UDYAM-MH-01-0012345'),
              _field('RERA Number',   _rera,  _v.rera,  hint: 'UPRERAPRJ123456'),

              const SizedBox(height: 16),
              const _SectionHeader('🏦 Banking & Finance'),
              _field('IFSC Code',        _ifsc,        _v.ifsc,        hint: 'SBIN0001234'),
              _field('UPI ID',           _upi,         _v.upi,         hint: 'name@paytm'),
              _field('Bank Account No.', _bankAccount, _v.bankAccount, hint: '1234567890', keyboard: TextInputType.number),
              _field('Card Number',      _cardNumber,  _v.cardNumber,  hint: '4111 1111 1111 1111', keyboard: TextInputType.number),
              _field('MICR Code',        _micr,        _v.micr,        hint: '400002009', keyboard: TextInputType.number),
              _field('EPF Account No.',  _epf,         _v.epf,         hint: 'MH/BAN/0012345/000/0001234'),
              _field('Amount (₹)',       _amount,      (v) => _v.amount(v, min: 1, max: 1000000), hint: '5000', keyboard: TextInputType.number),

              const SizedBox(height: 16),
              const _SectionHeader('🏥 Health'),
              _field('ABHA Number', _abha, _v.abha, hint: '12345678901234 or name@abdm'),

              const SizedBox(height: 16),
              const _SectionHeader('📍 Address & Vehicle'),
              _field('Pincode',        _pincode, _v.pincode, hint: '380001', keyboard: TextInputType.number),
              _field('Vehicle Number', _vehicle, _v.vehicle, hint: 'GJ01AB1234'),

              const SizedBox(height: 16),
              const _SectionHeader('🌐 Digital'),
              _field('Website URL',   _url, _v.url,                    hint: 'https://example.com', keyboard: TextInputType.url),
              _field('OTP (6-digit)', _otp, (v) => _v.otp(v, length: 6), hint: '123456', keyboard: TextInputType.number),

              const SizedBox(height: 24),
              FilledButton.icon(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      const SnackBar(
                        content: Text('✅ All validations passed!'),
                        backgroundColor: Colors.green,
                      ),
                    );
                  }
                },
                icon: const Icon(Icons.check_circle_outline),
                label: const Text('Validate All Fields', style: TextStyle(fontSize: 16)),
                style: FilledButton.styleFrom(
                  padding: const EdgeInsets.symmetric(vertical: 16),
                  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
                ),
              ),
              const SizedBox(height: 32),
            ],
          ),
        ),
      ),
    );
  }

  Widget _field(
      String label,
      TextEditingController controller,
      String? Function(String?) validator, {
        String? hint,
        bool obscure = false,
        TextInputType keyboard = TextInputType.text,
      }) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 12),
      child: TextFormField(
        controller: controller,
        validator: validator,
        obscureText: obscure,
        keyboardType: keyboard,
        decoration: InputDecoration(
          labelText: label,
          hintText: hint,
        ),
      ),
    );
  }
}

class _SectionHeader extends StatelessWidget {
  final String title;
  const _SectionHeader(this.title);

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 12, top: 4),
      child: Text(
        title,
        style: Theme.of(context).textTheme.titleMedium?.copyWith(
          fontWeight: FontWeight.bold,
          color: Theme.of(context).colorScheme.primary,
        ),
      ),
    );
  }
}
3
likes
0
points
42
downloads

Publisher

unverified uploader

Weekly Downloads

🇮🇳 India-first Flutter form validation package with 30+ validators. Covers Aadhaar, PAN, GST, IFSC, UPI, Driving License, Passport, Voter ID, CIN, TAN, FSSAI, ABHA, EPF, Card (Luhn), MICR, RERA, Udyam and more. Multi-language error messages: English, Hindi & Gujarati.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter

More

Packages that depend on bharatvalidator