emails_validator 1.0.2 copy "emails_validator: ^1.0.2" to clipboard
emails_validator: ^1.0.2 copied to clipboard

Simple and efficient email address validator for Dart. Validates email syntax without using regular expressions, following RFC standards with detailed debug information.

example/lib/main.dart

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Email Validator',
      theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true),
      home: const EmailValidatorPage(),
    );
  }
}

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

  @override
  State<EmailValidatorPage> createState() => _EmailValidatorPageState();
}

class _EmailValidatorPageState extends State<EmailValidatorPage> {
  final TextEditingController _emailController = TextEditingController();
  bool? _isValid;
  String _validationMessage = '';
  int _totalChecks = 0;
  int _validCount = 0;
  int _invalidCount = 0;

  final List<String> _exampleEmails = [
    'user@example.com',
    'test.email@domain.co.uk',
    'user+tag@example.org',
    'user.name@example.com',
    'invalid-email',
    '@example.com',
    'user@',
    'user@.com',
    'user..name@example.com',
    'user@-example.com',
  ];

  void _validateEmail(String email) {
    if (email.trim().isEmpty) {
      setState(() {
        _isValid = null;
        _validationMessage = '';
      });
      return;
    }

    final isValid = EmailsValidator.validate(email);
    setState(() {
      _isValid = isValid;
      _validationMessage = isValid ? 'VALID' : 'INVALID';
      _totalChecks++;
      if (isValid) {
        _validCount++;
      } else {
        _invalidCount++;
      }
    });
  }

  void _useExampleEmail(String email) {
    _emailController.text = email;
    _validateEmail(email);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('📧 Email Validator'),
        backgroundColor: Colors.blue,
        foregroundColor: Colors.white,
        elevation: 0,
      ),
      body: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
            colors: [Color(0xFF667eea), Color(0xFF764ba2)],
          ),
        ),
        child: SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(20.0),
            child: Column(
              children: [
                Expanded(
                  child: SingleChildScrollView(
                    child: Column(
                      children: [
                        // Main input section
                        Card(
                          elevation: 8,
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(15),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.all(24.0),
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                const Text(
                                  'Enter email address:',
                                  style: TextStyle(
                                    fontSize: 18,
                                    fontWeight: FontWeight.bold,
                                    color: Colors.black87,
                                  ),
                                ),
                                const SizedBox(height: 16),
                                TextField(
                                  controller: _emailController,
                                  decoration: InputDecoration(
                                    hintText: 'example@domain.com',
                                    border: OutlineInputBorder(
                                      borderRadius: BorderRadius.circular(8),
                                    ),
                                    focusedBorder: OutlineInputBorder(
                                      borderRadius: BorderRadius.circular(8),
                                      borderSide: const BorderSide(
                                        color: Colors.blue,
                                        width: 2,
                                      ),
                                    ),
                                  ),
                                  onChanged: _validateEmail,
                                  textInputAction: TextInputAction.done,
                                ),
                                const SizedBox(height: 20),
                                if (_isValid != null) ...[
                                  Container(
                                    width: double.infinity,
                                    padding: const EdgeInsets.all(16),
                                    decoration: BoxDecoration(
                                      color: _isValid!
                                          ? Colors.green.shade100
                                          : Colors.red.shade100,
                                      borderRadius: BorderRadius.circular(8),
                                      border: Border.all(
                                        color: _isValid!
                                            ? Colors.green
                                            : Colors.red,
                                        width: 2,
                                      ),
                                    ),
                                    child: Row(
                                      children: [
                                        Icon(
                                          _isValid!
                                              ? Icons.check_circle
                                              : Icons.cancel,
                                          color: _isValid!
                                              ? Colors.green
                                              : Colors.red,
                                          size: 24,
                                        ),
                                        const SizedBox(width: 12),
                                        Expanded(
                                          child: Text(
                                            '$_validationMessage: ${_emailController.text}',
                                            style: TextStyle(
                                              fontSize: 16,
                                              fontWeight: FontWeight.bold,
                                              color: _isValid!
                                                  ? Colors.green.shade800
                                                  : Colors.red.shade800,
                                            ),
                                          ),
                                        ),
                                      ],
                                    ),
                                  ),
                                ],
                              ],
                            ),
                          ),
                        ),
                        const SizedBox(height: 24),

                        // Statistics section
                        Card(
                          elevation: 8,
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(15),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.all(24.0),
                            child: Column(
                              children: [
                                const Text(
                                  'Statistics',
                                  style: TextStyle(
                                    fontSize: 20,
                                    fontWeight: FontWeight.bold,
                                    color: Colors.black87,
                                  ),
                                ),
                                const SizedBox(height: 16),
                                Row(
                                  children: [
                                    Expanded(
                                      child: _buildStatCard(
                                        'Total',
                                        _totalChecks.toString(),
                                        Colors.blue,
                                      ),
                                    ),
                                    const SizedBox(width: 12),
                                    Expanded(
                                      child: _buildStatCard(
                                        'Valid',
                                        _validCount.toString(),
                                        Colors.green,
                                      ),
                                    ),
                                    const SizedBox(width: 12),
                                    Expanded(
                                      child: _buildStatCard(
                                        'Invalid',
                                        _invalidCount.toString(),
                                        Colors.red,
                                      ),
                                    ),
                                  ],
                                ),
                              ],
                            ),
                          ),
                        ),
                        const SizedBox(height: 24),

                        // Examples section
                        Card(
                          elevation: 8,
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(15),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.all(24.0),
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                const Text(
                                  '💡 Try these examples:',
                                  style: TextStyle(
                                    fontSize: 20,
                                    fontWeight: FontWeight.bold,
                                    color: Colors.black87,
                                  ),
                                ),
                                const SizedBox(height: 16),
                                Wrap(
                                  spacing: 8,
                                  runSpacing: 8,
                                  children: _exampleEmails.map((email) {
                                    final isValid = EmailsValidator.validate(
                                      email,
                                    );
                                    return InkWell(
                                      onTap: () => _useExampleEmail(email),
                                      child: Container(
                                        padding: const EdgeInsets.symmetric(
                                          horizontal: 12,
                                          vertical: 8,
                                        ),
                                        decoration: BoxDecoration(
                                          color: isValid
                                              ? Colors.green.shade50
                                              : Colors.red.shade50,
                                          borderRadius: BorderRadius.circular(
                                            6,
                                          ),
                                          border: Border.all(
                                            color: isValid
                                                ? Colors.green
                                                : Colors.red,
                                            width: 1,
                                          ),
                                        ),
                                        child: Text(
                                          email,
                                          style: TextStyle(
                                            fontSize: 14,
                                            color: isValid
                                                ? Colors.green.shade800
                                                : Colors.red.shade800,
                                            fontWeight: FontWeight.w500,
                                          ),
                                        ),
                                      ),
                                    );
                                  }).toList(),
                                ),
                              ],
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildStatCard(String label, String value, Color color) {
    return Container(
      padding: const EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: color.withValues(alpha: 0.1),
        borderRadius: BorderRadius.circular(8),
        border: Border.all(color: color.withValues(alpha: 0.3)),
      ),
      child: Column(
        children: [
          Text(
            value,
            style: TextStyle(
              fontSize: 24,
              fontWeight: FontWeight.bold,
              color: color,
            ),
          ),
          const SizedBox(height: 4),
          Text(
            label,
            style: TextStyle(fontSize: 14, color: color.withValues(alpha: 0.8)),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _emailController.dispose();
    super.dispose();
  }
}
1
likes
160
points
45
downloads

Publisher

verified publisherworldin.net

Weekly Downloads

Simple and efficient email address validator for Dart. Validates email syntax without using regular expressions, following RFC standards with detailed debug information.

Repository (GitHub)
View/report issues

Topics

#email #validation #rfc #dart #flutter

Documentation

API reference

License

MIT (license)

More

Packages that depend on emails_validator