egyptian_banks 0.0.1
egyptian_banks: ^0.0.1 copied to clipboard
A Flutter package providing comprehensive data about banks operating in Egypt with bilingual support (Arabic & English), including bank logos.
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,
),
);
},
),
),
],
),
),
);
}
}