A Kotlin Multiplatform Country Code and Dial Code Picker with flag support and search functionality. This library provides a customizable dropdown component that enables users to:
- Search and select any country
- Retrieve the country name, ISO country code (GB, US, FR etc.)
- Get the country dial code (+44, +1, +33 etc.)
- Display the country flag and retrieve usable a flag resource
- View countries in their native device language e.g. instead of "Germany", a German user will see "Deutschland"
- π Full list of countries and dial codes
- π Search by name or dial code
- π Native flag support
- π¦ Lightweight & efficient
- β»οΈ Kotlin Multiplatform compatible
- π Built-in localization support
| Platform | Supported |
|---|---|
| Android | βοΈ |
| iOS | βοΈ |
| Desktop | βοΈ |
| Web | βοΈ |
See the releases section of this repository for the latest version.
To your build.gradle under commonMain.dependencies add:
implementation "com.wannaverse:countryselector:<version>"Important this library uses native code to handle translations. You will need the additional dependencies depending on the targets you are building for:
Android under androidMain.dependencies:
implementation("com.wannaverse:countryselector-android:")
iOS (ARM) under iosMain.dependencies:
implementation("com.wannaverse:countryselector-iosarm64:")
iOS x64 under iosMain.dependencies:
implementation("com.wannaverse:countryselector-iosx64:")
jvm: implementation("com.wannaverse:countryselector-jvm:")
Below is a sample code that you may use.
Be aware: The Box is required if you are using any sort of scroll behavior with your screen. This is because this CountryPickerIcon uses a LazyColumn for it's scrollable functionality.
var selectedCountry by remember { mutableStateOf(Countries.US) }
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier.height(50.dp)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.outline,
shape = MaterialTheme.shapes.medium
)
.padding(8.dp),
contentAlignment = Alignment.Center
) {
CountrySelector(
country = selectedCountry,
onSelection = { selectedCountry = it }
)
}
}To change the language of the country picker manually, before creating the CountryPickerIcon set:
Countries.languageTag = "es" // as long as it's a IETF language tagYou can further customize the look and feel of the picker so that it's exactly how you want it:
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier
.height(50.dp)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.outline,
shape = MaterialTheme.shapes.medium
)
.padding(8.dp),
contentAlignment = Alignment.Center
) {
CountrySelector(
country = selectedCountry,
onSelection = { selectedCountry = it },
pickerRowContent = { country ->
Row(
modifier = Modifier,
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(
resource = country.flagImageResource,
),
contentDescription = country.countryName,
modifier = Modifier
.size(24.dp)
.clip(CircleShape)
)
Spacer(Modifier.width(8.dp))
Text(country.countryName)
Spacer(Modifier.weight(1f))
Text(country.internationalDialCode)
} },
searchBarContent = { searchQuery, onQueryChange, hasError ->
TextField(
value = searchQuery,
onValueChange = onQueryChange,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
label = { Text("Search Countries") },
trailingIcon = {
if (hasError) {
Icon(Icons.Default.Error, contentDescription = "No results found")
} },
isError = hasError,
placeholder = { Text("Search by country name or code") }
)
}
)
}
}| Light Theme | Dark Theme |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Light Theme | Dark Theme |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
MIT LICENSE. See LICENSE for details.
Pull requests and feature requests are welcome! If you encounter any issues, feel free to open an issue.












