Есть ли у вас опыт работы с WebSocket во Flutter?

«Есть ли у вас опыт работы с WebSocket во Flutter?» — вопрос из категории Сети, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я использовал WebSocket для реализации функций реального времени, таких как чаты и live-обновления данных. Во Flutter для этого обычно применяется пакет web_socket_channel.

Основной паттерн работы:

  1. Установить соединение с сервером.
  2. Слушать входящие сообщения через Stream.
  3. Отправлять данные через Sink.
  4. Корректно обрабатывать закрытие соединения и ошибки.

Пример реализации простого клиента:

import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/io.dart';

class WebSocketService {
  late WebSocketChannel _channel;
  Stream get stream => _channel.stream;

  void connect(String url) {
    _channel = IOWebSocketChannel.connect(Uri.parse(url));

    // Слушаем сообщения
    _channel.stream.listen(
      (message) => _handleMessage(message),
      onError: (error) => _handleError(error),
      onDone: () => _handleDisconnection(),
    );
  }

  void send(String data) {
    if (_channel.closeCode == null) {
      _channel.sink.add(data);
    }
  }

  void _handleMessage(dynamic message) {
    // Логика обработки сообщения (например, парсинг JSON)
    print('Received: $message');
  }

  void dispose() {
    _channel.sink.close();
  }
}

Ключевые моменты из практики:

  • Управление состоянием соединения: Важно отслеживать статус (connecting, connected, disconnected) и показывать его пользователю.
  • Переподключение: Реализуется через retry логику с экспоненциальной задержкой, например, с помощью пакета async.
  • Сериализация: Для сложных данных используется jsonEncode/jsonDecode. Для бинарных данных можно использовать Uint8List.
  • Socket.IO: Для проектов, где сервер использует Socket.IO, применяется пакет socket_io_client, который требует другой подход к обработке событий и комнат.