egyptian_banks 0.0.2 copy "egyptian_banks: ^0.0.2" to clipboard
egyptian_banks: ^0.0.2 copied to clipboard

A Flutter package providing comprehensive data about banks operating in Egypt with bilingual support (Arabic & English), including bank logos.

example/lib/main.dart

import 'package:egyptian_banks/egyptian_banks.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

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

/// Widget to display bank logo (supports SVG, PNG, JPG)
class BankLogo extends StatelessWidget {
  final String imagePath;
  final double size;

  const BankLogo({super.key, required this.imagePath, this.size = 48});

  @override
  Widget build(BuildContext context) {
    if (imagePath.toLowerCase().endsWith('.svg')) {
      return SizedBox(
        width: size,
        height: size,
        child: SvgPicture.asset(
          imagePath,
          placeholderBuilder: (context) => _buildPlaceholder(),
        ),
      );
    }
    return Image.asset(
      imagePath,
      width: size,
      height: size,
      errorBuilder: (context, error, stackTrace) => _buildPlaceholder(),
    );
  }

  Widget _buildPlaceholder() {
    return SizedBox(
      width: size,
      height: size,
      child: const Icon(Icons.account_balance),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Egyptian Banks Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const BanksListScreen(),
    );
  }
}

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

  @override
  State<BanksListScreen> createState() => _BanksListScreenState();
}

class _BanksListScreenState extends State<BanksListScreen> {
  final EgyptianBanks _egyptianBanks = EgyptianBanks();
  List<Bank> _banks = [];
  List<Bank> _filteredBanks = [];
  bool _isLoading = true;
  bool _isArabic = false;
  final TextEditingController _searchController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _loadBanks();
  }

  @override
  void dispose() {
    _searchController.dispose();
    super.dispose();
  }

  Future<void> _loadBanks() async {
    final banks = await _egyptianBanks.getAllBanks(
      language: _isArabic ? 'ar' : 'en',
    );
    setState(() {
      _banks = banks;
      _filteredBanks = banks;
      _isLoading = false;
    });
  }

  void _filterBanks(String query) {
    setState(() {
      if (query.isEmpty) {
        _filteredBanks = _banks;
      } else {
        _filteredBanks = _banks.where((bank) {
          final name = _isArabic ? bank.nameAr : bank.nameEn;
          return name.toLowerCase().contains(query.toLowerCase());
        }).toList();
      }
    });
  }

  void _toggleLanguage() {
    setState(() {
      _isArabic = !_isArabic;
      _isLoading = true;
      _searchController.clear();
    });
    _loadBanks();
  }

  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: _isArabic ? TextDirection.rtl : TextDirection.ltr,
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
          title: Text(_isArabic ? 'البنوك المصرية' : 'Egyptian Banks'),
          actions: [
            IconButton(
              icon: const Icon(Icons.language),
              tooltip: _isArabic ? 'English' : 'عربي',
              onPressed: _toggleLanguage,
            ),
          ],
        ),
        body: Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: TextField(
                controller: _searchController,
                decoration: InputDecoration(
                  hintText: _isArabic ? 'بحث...' : 'Search...',
                  prefixIcon: const Icon(Icons.search),
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(12),
                  ),
                  suffixIcon: _searchController.text.isNotEmpty
                      ? IconButton(
                          icon: const Icon(Icons.clear),
                          onPressed: () {
                            _searchController.clear();
                            _filterBanks('');
                          },
                        )
                      : null,
                ),
                onChanged: _filterBanks,
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 16.0),
              child: Row(
                children: [
                  Text(
                    _isArabic
                        ? '${_filteredBanks.length} بنك'
                        : '${_filteredBanks.length} banks',
                    style: Theme.of(context).textTheme.bodySmall,
                  ),
                ],
              ),
            ),
            const SizedBox(height: 8),
            Expanded(
              child: _isLoading
                  ? const Center(child: CircularProgressIndicator())
                  : _filteredBanks.isEmpty
                  ? Center(
                      child: Text(
                        _isArabic ? 'لا توجد نتائج' : 'No results found',
                      ),
                    )
                  : ListView.builder(
                      itemCount: _filteredBanks.length,
                      itemBuilder: (context, index) {
                        final bank = _filteredBanks[index];
                        return ListTile(
                          leading: bank.hasImage
                              ? BankLogo(imagePath: bank.image)
                              : const CircleAvatar(
                                  child: Icon(Icons.account_balance),
                                ),
                          title: Text(_isArabic ? bank.nameAr : bank.nameEn),
                          subtitle: Text(
                            _isArabic ? bank.nameEn : bank.nameAr,
                            style: Theme.of(context).textTheme.bodySmall,
                          ),
                        );
                      },
                    ),
            ),
          ],
        ),
      ),
    );
  }
}
1
likes
160
points
127
downloads

Publisher

unverified uploader

Weekly Downloads

A Flutter package providing comprehensive data about banks operating in Egypt with bilingual support (Arabic & English), including bank logos.

Repository (GitHub)
View/report issues

Topics

#egypt #banks #arabic #localization

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on egyptian_banks