Получение статуса подключения в Dart

Как можно получить статус подключения WebSocket в библиотеке io.dart?

Создаю соединение через

client = IOWebSocketChannel.connect(url);

И в зависимости от успешности соединения нужно пробрасывать его состояние.

Если пытаюсь подключиться к некорректному серверу, то вылетает такой выход

E/flutter ( 6678): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: WebSocketChannelException: WebSocketChannelException: SocketException: Failed host lookup: 'echo.websocket.or' (OS Error: No address associated with hostname, errno = 7)
E/flutter ( 6678): #0      new IOWebSocketChannel._withoutSocket.<anonymous closure> (package:web_socket_channel/io.dart:84:24)
E/flutter ( 6678): #1      _invokeErrorHandler (dart:async/async_error.dart:16:24)
E/flutter ( 6678): #2      _HandleErrorStream._handleError (dart:async/stream_pipe.dart:282:9)
E/flutter ( 6678): #3      _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:161:13)
E/flutter ( 6678): #4      _rootRunBinary (dart:async/zone.dart:1214:47)
E/flutter ( 6678): #5      _CustomZone.runBinary (dart:async/zone.dart:1107:19)
E/flutter ( 6678): #6      _CustomZone.runBinaryGuarded (dart:async/zone.dart:1013:7)
E/flutter ( 6678): #7      _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:376:15)
E/flutter ( 6678): #8      _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:394:16)
E/flutter ( 6678): #9      _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:294:7)
E/flutter ( 6678): #10     _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:812:19)
E/flutter ( 6678): #11     _StreamController._addError (dart:async/stream_controller.dart:690:7)
E/flutter ( 6678): #12     _rootRunBinary (dart:async/zone.dart:1214:47)
E/flutter ( 6678): #13     _CustomZone.runBinary (dart:async/zone.dart:1107:19)
E/flutter ( 6678): #14     _CustomZone.runBinaryGuarded (dart:async/zone.dart:1013:7)
E/flutter ( 6678): #15     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:376:15)
E/flutter ( 6678): #16     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:394:16)
E/flutter ( 6678): #17     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:294:7)
E/flutter ( 6678): #18     _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:812:19)
E/flutter ( 6678): #19     _StreamController._addError (dart:async/stream_controller.dart:690:7)
E/flutter ( 6678): #20     new Stream.fromFuture.<anonymous closure> (dart:async/stream.dart:178:18)
E/flutter ( 6678): #21     _rootRunBinary (dart:async/zone.dart:1214:47)
E/flutter ( 6678): #22     _CustomZone.runBinary (dart:async/zone.dart:1107:19)
E/flutter ( 6678): #23     _FutureListener.handleError (dart:async/future_impl.dart:157:20)
E/flutter ( 6678): #24     Future._propagateToListeners.handleError (dart:async/future_impl.dart:708:47)
E/flutter ( 6678): #25     Future._propagateToListeners (dart:async/future_impl.dart:729:24)
E/flutter ( 6678): #26     Future._completeError (dart:async/future_impl.dart:537:5)
E/flutter ( 6678): #27     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:593:7)
E/flutter ( 6678): #28     _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 6678): #29     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 6678): #30     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 6678): #31     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 6678): #32     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 6678): #33     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter ( 6678): 

Ответы (1 шт):

Автор решения: MiT

Не забывайте обрабатывать ошибки:

try {
  client = IOWebSocketChannel.connect("wss://...");
} catch(e){
  // Обработка ошибок
}

Также надо понимать что WebSocket это по сути поток, с ним надо работать как с потоком (использовать Stream, StreamBuilder и тд.).

Закрываем поток:

client.sink.close();

Отправляем сообщение на сервер:

client.sink.add("send data to the server");

Слушаем ответ сервера:

client.stream.listen(
  (message){
    // обработки поступающих сообщений
  },
  onError: (error, StackTrace stackTrace){
    // обработка ошибок
  },
  onDone: (){
    // сообщение было закрыто (завершение потока)
  }
);

Слушаем ответ и строим виджет:

StreamBuilder(
  stream: client.stream,
  builder: (context, snapshot) {
    return Text(snapshot.hasData ? "${snapshot.data}" : "No data");
  },
);
→ Ссылка