Flutter Profile Kit 👤

A comprehensive Flutter package for profile management UI components including profile image picker, user info forms, and location selection.

Features ✨

  • 📸 Profile Image Picker: Beautiful circular avatar with floating add badge
  • 📝 User Info Form: Comprehensive form for personal information
  • 📍 Location Form: Location selection with country, city, and address fields
  • 🎮 Smart Controller: Profile data management and validation
  • 📱 Platform Adaptive: Automatically adapts to iOS and Android design patterns
  • 🎨 Highly Customizable: Colors, spacing, sizing, and styling options
  • ♿ Accessibility Ready: Proper semantic structure and screen reader support
  • 🌍 Localization Ready: All text is customizable for different languages
  • ⚡ Performance Optimized: Efficient image handling and form validation

Installation 📦

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

dependencies:
  flutter_profile_kit: ^1.0.0

Then run:

flutter pub get

Usage 🚀

Profile Image Picker

import 'package:flutter_profile_kit/flutter_profile_kit.dart';

ProfileImagePicker(
  onImagePicked: (image) => setState(() => _profileImage = image),
  initialImage: _profileImage,
  avatarRadius: 96,
  badgeSize: 34,
  backgroundColor: Colors.grey.shade200,
  badgeColor: Colors.blue,
  placeholderIcon: Icons.person,
  enableCamera: true,
  enableGallery: true,
  imageQuality: 80,
)

User Info Form

UserInfoForm(
  onDataChanged: (data) => setState(() => _profileData = data),
  initialData: _profileData,
  requiredFields: [
    UserInfoField.firstName,
    UserInfoField.lastName,
    UserInfoField.email,
  ],
  fieldLabels: {
    UserInfoField.firstName: 'First Name',
    UserInfoField.lastName: 'Last Name',
    UserInfoField.email: 'Email Address',
  },
  fieldHints: {
    UserInfoField.firstName: 'Enter your first name',
    UserInfoField.lastName: 'Enter your last name',
    UserInfoField.email: 'Enter your email address',
  },
)

Location Form

LocationForm(
  onDataChanged: (data) => setState(() => _profileData = data),
  initialData: _profileData,
  requiredFields: [
    LocationField.country,
    LocationField.city,
  ],
  showAddressField: true,
  fieldLabels: {
    LocationField.country: 'Country',
    LocationField.governorate: 'State/Province',
    LocationField.city: 'City',
    LocationField.address: 'Address',
  },
)

Profile Controller

final controller = ProfileController(
  initialData: ProfileData(
    firstName: 'John',
    lastName: 'Doe',
    email: 'john.doe@example.com',
  ),
  requiredFields: [
    ProfileField.firstName,
    ProfileField.lastName,
    ProfileField.email,
  ],
  onDataChanged: (data) => print('Profile updated: $data'),
  onImageChanged: (image) => print('Image updated: $image'),
  onValidationChanged: (isValid) => print('Validation: $isValid'),
);

// Update profile data
controller.updateProfile(ProfileData(firstName: 'Jane'));

// Update specific field
controller.updateField(ProfileField.email, 'jane.doe@example.com');

// Update profile image
controller.updateProfileImage(File('/path/to/image.jpg'));

// Validate profile
if (controller.isValid) {
  print('Profile is valid');
} else {
  print('Validation errors: ${controller.validationErrors}');
}

Complete Profile Screen Example

class ProfileScreen extends StatefulWidget {
  @override
  _ProfileScreenState createState() => _ProfileScreenState();
}

class _ProfileScreenState extends State<ProfileScreen> {
  late ProfileController _controller;
  ProfileData _profileData = const ProfileData();

  @override
  void initState() {
    super.initState();
    _controller = ProfileController(
      initialData: _profileData,
      onDataChanged: (data) => setState(() => _profileData = data),
      onImageChanged: (image) => print('Image changed: $image'),
      onValidationChanged: (isValid) => print('Valid: $isValid'),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Profile')),
      body: SingleChildScrollView(
        child: Column(
          children: [
            // Profile Image Picker
            Padding(
              padding: EdgeInsets.all(32),
              child: ProfileImagePicker(
                onImagePicked: _controller.updateProfileImage,
                initialImage: _profileData.profileImage,
                avatarRadius: 80,
                badgeSize: 28,
              ),
            ),
            
            // User Info Form
            UserInfoForm(
              onDataChanged: _controller.updateProfile,
              initialData: _profileData,
              requiredFields: [
                UserInfoField.firstName,
                UserInfoField.lastName,
                UserInfoField.email,
              ],
            ),
            
            // Location Form
            LocationForm(
              onDataChanged: _controller.updateProfile,
              initialData: _profileData,
              requiredFields: [
                LocationField.country,
                LocationField.city,
              ],
              showAddressField: true,
            ),
            
            // Save Button
            Padding(
              padding: EdgeInsets.all(16),
              child: ElevatedButton(
                onPressed: _controller.isValid ? _saveProfile : null,
                child: Text('Save Profile'),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _saveProfile() {
    // Save profile logic
    print('Saving profile: $_profileData');
  }
}

Customization 🎨

Profile Image Picker Styling

ProfileImagePicker(
  avatarRadius: 120,
  badgeSize: 40,
  backgroundColor: Colors.blue.shade50,
  badgeColor: Colors.blue,
  placeholderIcon: Icons.account_circle,
  placeholderIconSize: 60,
  placeholderIconColor: Colors.blue,
  badgeIcon: Icons.camera_alt,
  badgeIconSize: 24,
  badgeIconColor: Colors.white,
  badgeAngle: 45,
  borderWidth: 3,
  borderColor: Colors.blue,
  shadowColor: Colors.blue.withOpacity(0.3),
  shadowBlurRadius: 12,
  shadowOffset: Offset(0, 6),
)

Form Styling

UserInfoForm(
  padding: EdgeInsets.all(24),
  fieldSpacing: 20,
  fieldHeight: 65,
  borderRadius: 16,
  backgroundColor: Colors.white,
  borderColor: Colors.grey.shade300,
  focusedBorderColor: Colors.blue,
  errorBorderColor: Colors.red,
  textColor: Colors.black87,
  hintColor: Colors.grey.shade600,
  errorColor: Colors.red,
  labelColor: Colors.black87,
  textStyle: TextStyle(fontSize: 16),
  hintStyle: TextStyle(fontSize: 14),
  labelStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.w600),
  errorStyle: TextStyle(fontSize: 12),
)

Widgets 📱

ProfileImagePicker

Beautiful profile image picker with circular avatar, floating add badge, and image selection options.

UserInfoForm

Comprehensive form for collecting user information with validation and customizable styling.

LocationForm

Location selection form with country, governorate, city, and address fields.

ProfileData

Data model for user profile information with validation and utility methods.

ProfileController

Controller for managing profile data, validation, and form state.

Dependencies 📋

  • flutter: SDK
  • flutter_platform_widgets: Platform-adaptive widgets
  • image_picker: Image selection functionality
  • flutter_svg: SVG icon support

Contributing 🤝

Contributions are welcome! Please feel free to submit a Pull Request.

License 📄

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

Support 💬

If you encounter any problems or have suggestions, please file an issue at the GitHub repository.


Made with ❤️ by seifmoustafa

Libraries

flutter_profile_kit
A comprehensive Flutter package for profile management UI components including profile image picker, user info forms, and location selection.