Інтеграція сервісу DaData для підказок адреси у мобільному додатку
Google Places Autocomplete добре працює в Європі та США. В Росії — гірше: невідомі корпуси, адреси виду «1А», адреси в промзонах, садові товариства. DaData вирішує саме це: їх база побудована на ФІАС/КЛАДР і знає адресний простір Росії значно глибше.
Що інтегруємо
Основний ендпоінт для підказок при вводі: POST https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address. Тіло запиту — JSON з полем query (введена рядок) та опціональним locations для обмеження по регіону. Відповідь містить масив suggestions, кожна з value (повна адреса), data.geo_lat, data.geo_lon, data.house, data.street, data.city_with_type.
Другий ендпоінт — геокодування по координатам: POST .../geolocate/address з lat/lon та radius_meters. Зручно як fallback до Google Reverse Geocoding для російських адрес.
Реалізація на iOS
Створюємо DaDataService з URLSession або Alamofire. Авторизація через заголовок Authorization: Token <API_KEY>. Ключ зберігаємо в xcconfig та читаємо через Bundle.main.infoDictionary — не хардкодимо.
Підказки показуємо в UITableView під текстовим полем. Запити дебаунсуємо через Combine: searchSubject.debounce(for: .milliseconds(300), scheduler: RunLoop.main). Без дебаунса при швидкому вводі улітають по запиту на кожен символ.
Приклад обробки відповіді:
struct DaDataSuggestion: Decodable {
let value: String
let data: DaDataAddress
}
struct DaDataAddress: Decodable {
let geoLat: String?
let geoLon: String?
let city: String?
let street: String?
let house: String?
enum CodingKeys: String, CodingKey {
case geoLat = "geo_lat"
case geoLon = "geo_lon"
case city, street, house
}
}
Важливо: geo_lat та geo_lon приходять як String, не Double. Конвертуємо через Double(geoLat ?? "") з перевіркою на nil.
Реалізація на Android
Retrofit-інтерфейс з @POST та @Header("Authorization"). Корутина в ViewModel, StateFlow<List<DaDataSuggestion>> для UI. Дебаунс через Flow.debounce(300) в collectLatest.
В compose-проекті LazyColumn під TextField з DropdownMenuItem або кастомним Popup. Важливо правильно керувати фокусом: при виборі підказки убираємо фокус з поля через LocalFocusManager.current.clearFocus() та скриваємо клавіатуру через LocalSoftwareKeyboardController.
Flutter
Пакету під DaData нема в pub.dev з нормальним рейтингом — пишемо свій DaDataRepository з Dio. Підказки отдаємо через StreamController з дебаунсом Timer(Duration(milliseconds: 300), ...). Для UI — ListView.builder в Overlay або пакет flutter_typeahead з кастомним suggestionsCallback.
Важливі нюанси
Квота на безплатному плані — 10 000 запитів на день. Для додатків з активною аудиторією цього не вистачить з першого тижня. Планувати квоту при виборі тарифу ще на етапі архітектури.
При первинній загрузці сторінки — не запитувати підказки для порожної рядки, це тратить квоту без користі. Мінімальна довжина запиту — 3 символи.
Тривалість інтеграції: один-два дні. Включає клієнтський сервіс, UI-компонент з дебаунсом, обробку вибору адреси та маппінг координат.







