Какие пакеты для проверки состояния сети во Flutter используются
Что проверяют
Знаете ли вы разницу между «есть сеть» и «есть интернет» и умеете ли строить приложение, которое переживает нестабильное соединение. Следом обычно спрашивают: «пакет показывает Wi-Fi, а запросы не проходят. Почему?»
Как отвечать
Основной пакет connectivity_plus, и про него важно знать две вещи.
Первое: он сообщает тип подключения (Wi-Fi, мобильная сеть, Ethernet, VPN, отсутствие сети), но не проверяет доступ в интернет. Документация пакета прямо предупреждает: Wi-Fi без выхода наружу или гостиничная сеть с авторизацией в браузере выглядят рабочим подключением. В нативном Android настоящий доступ видно по флагу NET_CAPABILITY_VALIDATED у NetworkCapabilities.
Второе: API менялся. С версии 6 checkConnectivity() и поток onConnectivityChanged отдают List<ConnectivityResult>, потому что устройство бывает подключено к нескольким сетям сразу. Код из старых статей со сравнением result == ConnectivityResult.wifi на новой версии молча перестаёт работать: список никогда не равен одиночному значению.
Реальный доступ проверяют пакетом internet_connection_checker_plus: он опрашивает несколько адресов и отдаёт hasInternetAccess и поток смены статуса. Адреса проверки разумно заменить на свой бэкенд.
Зрелый ответ такой: проверка сети нужна интерфейсу (баннер «нет соединения», пауза синхронизации), но не как фильтр перед каждым запросом. Запрос всё равно может упасть, поэтому ошибки обрабатывают там, где они возникают: SocketException, TimeoutException, в Dio DioException с типами connectionError и connectionTimeout. Поверх этого повторы с растущей задержкой и локальный кэш, чтобы экран не пустел без сети.
Где спотыкаются
Считают, что ConnectivityResult.wifi означает работающий интернет, и не показывают ошибку, когда запросы висят.
Проверяют сеть перед каждым запросом вместо обработки ошибок. Между проверкой и запросом соединение может пропасть, так что проверка ничего не гарантирует.
Подписываются на onConnectivityChanged в виджете и не отменяют StreamSubscription в dispose. Итог: утечка и вызовы setState у уже удалённого виджета.