stringSearch method
Filter by name, translated name or dial code.
A query of digits (with or without a leading +) matches dial codes by
prefix, so "44" finds the United Kingdom but not Angola (+244). Anything
else matches country names, accent- and case-insensitively, in English
and in every bundled translation.
Implementation
List<Country> stringSearch(String search, {String? languageCode}) {
final query = removeDiacritics(search.toLowerCase()).trim();
if (query.isEmpty) return List<Country>.of(this);
final digits = query.startsWith('+') ? query.substring(1).trim() : query;
if (digits.isNotEmpty && isNumeric(digits)) {
final byDial = where((c) =>
c.fullCountryCode.startsWith(digits) ||
c.dialCode.startsWith(digits)).toList();
// A bare number is almost always a dial code, but fall through to names
// so searching "1" in a list without +1 still shows something useful.
if (byDial.isNotEmpty || query.startsWith('+')) return byDial;
}
return where((country) {
if (removeDiacritics(country.name.toLowerCase()).contains(query)) {
return true;
}
if (country.code.toLowerCase() == query) return true;
return country.nameTranslations.values
.any((name) => removeDiacritics(name.toLowerCase()).contains(query));
}).toList();
}