The Fastest, Most Customizable Country Picker for Flutter
๐ Live Demo: View on GitHub Pages
- ๐ 252+ Countries - Complete ISO 3166-1 standard with flags, codes & phone numbers
- โก Blazing Fast - Search in 110ฮผs, optimized for weak devices
- ๐จ Fully Customizable - Colors, sizes, styles, themes - you name it!
- ๐ 19 Languages - Automatic localization with fallback
- ๐งฉ Zero Config - Works out of the box, just 1 line of code
- ๐ฑ Responsive - Perfect on mobile, tablet & desktop
- ๐ฏ Smart Suggestions - Shows relevant countries based on app locale
- Fuzzy search - find countries even with typos
- Multi-field search - by name, code, or phone
- Instant results - 110ฮผs per query
- Real-time filtering - as you type
- Locale-based suggestions - Shows countries that speak your app's language
- Population-based sorting - Larger countries appear first in suggestions
- French app โ Shows French-speaking countries first (France, Canada, Belgium, etc.)
- Spanish app โ Shows Spanish-speaking countries first (Spain, Mexico, Argentina, etc.)
- German app โ Shows German-speaking countries first (Germany, Austria, Switzerland, etc.)
- Fallback to English - For unsupported languages, shows English-speaking countries
- Dark theme - Beautiful default dark design
- Light theme - Clean light appearance
- Custom themes - Any color combination
- Responsive - Adapts to any screen size
Feature | country_search 2.8.4 | country_code_picker | country_picker |
---|---|---|---|
Builder API | โ Available | โ Not available | โ Not available |
Pre-built Themes | โ Available | โ Not available | โ Not available |
Fuzzy Search | โ Available | โ Not available | โ Not available |
252 Countries | โ Available | โ Not available | โ Not available |
Customizable UI | โ Advanced | ||
Smart Suggestions | โ Available | โ Not available | โ Not available |
Performance | โก 110ฮผs search | ๐ Slower | ๐ Slower |
Package Size | ๐ฆ ~113KB | ๐ฆ Larger | ๐ฆ Larger |
Add to your pubspec.yaml
:
dependencies:
country_search: ^2.8.4
import 'package:country_search/country_search.dart';
CountryPicker(
selectedCountry: selectedCountry,
onCountrySelected: (Country country) {
setState(() {
selectedCountry = country;
});
},
)
That's it! Your country picker is ready to use with smart suggestions based on your app's locale. ๐
// Basic Builder API
CountryPicker.builder()
.selectedCountry(selectedCountry)
.onCountrySelected((country) => setState(() => selectedCountry = country))
.build();
// With pre-built themes
CountryPicker.builder()
.selectedCountry(selectedCountry)
.onCountrySelected((country) => setState(() => selectedCountry = country))
.darkTheme() // or .lightTheme(), .purpleTheme(), .minimalTheme()
.build();
// Custom configuration
CountryPicker.builder()
.selectedCountry(selectedCountry)
.onCountrySelected((country) => setState(() => selectedCountry = country))
.showSuggestedCountries(true) // Enable smart suggestions (default)
.lightTheme()
.itemHeight(72.0)
.flagSize(28.0)
.textStyle(const TextStyle(fontSize: 16, fontWeight: FontWeight.w600))
.showCountryCodes(false)
.build();
// Adaptive height (content-based sizing)
CountryPicker.builder()
.selectedCountry(selectedCountry)
.onCountrySelected((country) => setState(() => selectedCountry = country))
.adaptiveHeight(true)
.build();
// Centered dialog presentation (instead of bottom sheet)
CountryPicker.builder()
.selectedCountry(selectedCountry)
.onCountrySelected((country) => setState(() => selectedCountry = country))
.modalPresentation(CountryPickerModalPresentation.dialog)
.build();
// Get localized country name
Text(country.getDisplayName(context))
The widget automatically detects your app's language. Add localization delegates:
MaterialApp(
locale: const Locale('de'), // Your app's language
localizationsDelegates: [
CountryLocalizations.delegate, // Our country picker localization
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en'),
const Locale('de'),
const Locale('ru'),
// Add your languages
],
)
Supported Languages: ๐บ๐ธ English, ๐ท๐บ Russian, ๐ช๐ธ Spanish, ๐ซ๐ท French, ๐ฉ๐ช German, ๐ฎ๐น Italian, ๐ฏ๐ต Japanese, ๐ฐ๐ท Korean, ๐ต๐น Portuguese, ๐จ๐ณ Chinese, ๐ธ๐ฆ Arabic, ๐ฎ๐ณ Hindi, ๐ฎ๐ฉ Indonesian, ๐ต๐ฑ Polish, ๐น๐ท Turkish, ๐บ๐ฆ Ukrainian, ๐ป๐ณ Vietnamese, ๐น๐ญ Thai, ๐ณ๐ฑ Dutch
Find countries even with typos:
"germny"
โ finds"Germany"
"japn"
โ finds"Japan"
"united sttes"
โ finds"United States"
Method | Description |
---|---|
.selectedCountry(Country?) |
Set selected country |
.onCountrySelected(Function) |
Set selection callback |
.labelText(String?) |
Set custom label |
.hintText(String?) |
Set custom hint |
.showPhoneCodes(bool) |
Show/hide phone codes |
.backgroundColor(Color?) |
Set background color |
.headerColor(Color?) |
Set header color |
.textColor(Color?) |
Set text color |
.accentColor(Color?) |
Set accent color |
.searchFieldColor(Color?) |
Set search field color |
.searchFieldBorderColor(Color?) |
Set search field border |
.cursorColor(Color?) |
Set cursor color |
.hintTextColor(Color?) |
Set hint text color |
.hoverColor(Color?) |
Set hover color |
.borderRadius(double?) |
Set border radius |
.textStyle(TextStyle?) |
Set text style |
.itemHeight(double?) |
Set item height |
.itemPadding(EdgeInsets?) |
Set item padding |
.flagSize(double?) |
Set flag size |
.showFlags(bool) |
Show/hide flags |
.showCountryCodes(bool) |
Show/hide country codes |
.adaptiveHeight(bool) |
Enable/disable adaptive height |
.showSuggestedCountries(bool) |
Enable/disable smart suggestions |
.modalPresentation(CountryPickerModalPresentation) |
Choose bottom sheet or centered dialog |
Property | Type | Default | Description |
---|---|---|---|
selectedCountry |
Country? |
null |
Currently selected country |
onCountrySelected |
Function(Country) |
Required | Selection callback |
labelText |
String? |
null |
Custom label text |
hintText |
String? |
null |
Custom hint text |
showPhoneCodes |
bool |
true |
Show phone codes |
backgroundColor |
Color? |
Dark theme | Modal background |
headerColor |
Color? |
Dark theme | Header background |
textColor |
Color? |
Dark theme | Text color |
accentColor |
Color? |
Green | Accent color |
searchFieldColor |
Color? |
Dark theme | Search field background |
searchFieldBorderColor |
Color? |
Dark theme | Search field border |
cursorColor |
Color? |
White | Text cursor color |
hintTextColor |
Color? |
Dark theme | Hint text color |
hoverColor |
Color? |
Dark theme | Hover color |
borderRadius |
double? |
8.0 |
Border radius |
textStyle |
TextStyle? |
14px |
Custom text style |
itemHeight |
double? |
56.0 |
Item height |
itemPadding |
EdgeInsets? |
12x8 |
Item padding (horizontal: 12, vertical: 8) |
flagSize |
double? |
20.0 |
Flag size |
showFlags |
bool |
true |
Show flags |
showCountryCodes |
bool |
true |
Show country codes |
adaptiveHeight |
bool |
false |
Enable adaptive height |
showSuggestedCountries |
bool |
true |
Enable smart suggestions |
modalPresentation |
CountryPickerModalPresentation |
bottomSheet |
Modal presentation style |
You can choose how the country picker appears:
// Bottom sheet (default)
CountryPicker(
onCountrySelected: (c) {},
);
// Centered dialog
CountryPicker(
onCountrySelected: (c) {},
modalPresentation: CountryPickerModalPresentation.dialog,
);
class Country {
final String code; // "US", "DE", "RU"
final String flag; // "๐บ๐ธ", "๐ฉ๐ช", "๐ท๐บ"
final String phoneCode; // "+1", "+49", "+7"
String getDisplayName(BuildContext context); // Get localized name
}
To reduce package size, remove language files you don't need:
rm lib/src/flutter_country_picker/localizations/country_localizations_es.dart
Then update the localization files accordingly.
MIT License - see LICENSE for details.
Stanislav Bozhko
Email: [email protected]
GitHub: @stanislavworldin
If this package helps you, consider buying me a coffee! โ
โญ Star this repository if you find it useful!