> Какие пакеты для проверки состояния сети во Flutter используются (Flutter, Android)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: PashaPay
Стек: Flutter, Android
> Пример ответа
Короткий ответ
Основные пакеты для проверки состояния сети во Flutter - connectivity_plus (от Flutter Community) и internet_connection_checker (или его форк internet_connection_checker_plus). Первый даёт информацию о типе подключения (Wi-Fi, мобильные данные, none), второй - фактическую доступность интернета через HTTP-запросы. Для production-приложений часто используют оба: connectivity_plus для мониторинга изменений, internet_connection_checker для подтверждения реального доступа к сети.
Подробное объяснение
connectivity_plus - стандартный пакет на базе платформенных API (ConnectivityManager на Android, NWPathMonitor на iOS). Он сообщает о наличии сетевого интерфейса, но не гарантирует доступ к интернету: устройство может быть подключено к Wi-Fi роутеру без выхода в сеть.
internet_connection_checker выполняет периодические HTTP-запросы к надёжным endpoint'ам (по умолчанию - Google, Cloudflare) и возвращает true, если получен ожидаемый ответ. Это более точная проверка, но она создаёт дополнительную нагрузку и задержку.
Для senior-уровня важно понимать trade-off: connectivity_plus мгновенно реагирует на смену интерфейса, но не даёт гарантии доступа; internet_connection_checker даёт точный ответ, но с задержкой и трафиком. Оптимальный подход - комбинировать: слушать изменения через connectivity_plus, затем подтверждать доступ через internet_connection_checker.
Также существуют альтернативы: data_connection_checker (устаревший), network_info_plus (только информация о сети, без мониторинга), или ручная реализация через dart:io Socket.connect с таймаутом.
На практике
В реальных проектах обычно создают сервис-обёртку, который:
- подписывается на стрим
connectivity_plusдля мгновенного уведомления об изменении типа подключения; - при каждом изменении запускает проверку через
internet_connection_checkerс таймаутом; - кэширует последний статус и предоставляет его через
ValueNotifierилиStream.
Важно учитывать, что на Android 10+ и iOS 14+ системные ограничения не позволяют получить точный тип подключения без дополнительных разрешений - connectivity_plus возвращает обобщённые значения.
Для критичных операций (загрузка данных, отправка форм) лучше использовать internet_connection_checker перед самим запросом, а не полагаться только на статус из connectivity_plus.
Пример кода
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; class NetworkService { final Connectivity _connectivity = Connectivity(); final InternetConnectionChecker _checker = InternetConnectionChecker(); Stream<NetworkStatus> get statusStream => _connectivity.onConnectivityChanged .asyncMap((result) async { final hasInternet = await _checker.hasConnection; return NetworkStatus( hasConnection: hasInternet, connectionType: result, ); }); Future<NetworkStatus> checkNow() async { final result = await _connectivity.checkConnectivity(); final hasInternet = await _checker.hasConnection; return NetworkStatus( hasConnection: hasInternet, connectionType: result, ); } } class NetworkStatus { final bool hasConnection; final ConnectivityResult connectionType; NetworkStatus({ required this.hasConnection, required this.connectionType, }); }
Как отвечать на собеседовании
Начни с перечисления основных пакетов, затем объясни разницу между ними: connectivity_plus - только тип подключения, internet_connection_checker - фактический доступ. Подчеркни, что для надёжного решения нужно комбинировать оба подхода. Упомяни про таймауты, кэширование и обработку edge case'ов (например, VPN, captive portal). Покажи понимание платформенных ограничений. Если спросят про альтернативы - упомяни ручную проверку через Socket.connect и когда она оправдана.
Что проверяет интервьюер
Интервьюер оценивает:
- знание экосистемы Flutter и популярных пакетов;
- понимание разницы между "есть сетевой интерфейс" и "есть доступ к интернету";
- умение проектировать сервисный слой с учётом реактивности (Stream, asyncMap);
- осведомлённость о платформенных ограничениях и поведении на разных версиях ОС;
- способность обсуждать trade-off'ы (точность vs задержка, нагрузка на сеть).
Типичные ошибки
- Использовать только
connectivity_plusи считать, что это проверка интернета - на самом деле это проверка сетевого интерфейса. - Игнорировать таймауты в
internet_connection_checker- по умолчанию он ждёт ответа до 5 секунд, что может быть слишком долго для UI. - Подписываться на стрим
connectivity_plusбез обработки ошибок и отмены подписки - утечка памяти. - Не учитывать, что
connectivity_plusна Android может вернутьnoneпри включённом VPN или в режиме полёта. - Делать проверку интернета перед каждым запросом без кэширования - избыточная нагрузка на сеть и задержки в UI.
> Похожие задачи по mobile
Какие пакеты для локального хранения данных во Flutter использовать
Какие возможности есть у bloc из коробки во Flutter
Как работает таймер в iOS и с чем связана его работа
Что происходит с таймером, если он запущен в глобальной очереди, а не в главной в iOS
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью