> Какие пакеты для проверки состояния сети во 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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью