stringSearch method

List<Country> stringSearch(
  1. String search, {
  2. String? languageCode,
})

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();
}