Канал Webscoket не подключается после его закрытия - Flutter

Я создаю трансляцию потока веб-сокетов, доступ к которой осуществляется на нескольких страницах в приложении Flutter. Код как ниже

      class MyApp extends StatelessWidget {
  static IOWebSocketChannel channel =
      IOWebSocketChannel.connect(HttpService.wsUrl);
  static Stream stream = channel.stream.asBroadcastStream();

На других страницах я получаю доступ к этому каналу и потоку, используя

      
onConnected() async {
  MyApp.stream.listen((e) async {
       onMessage(e);
      },
       onDone: () async {
    debugPrint('ws channel closed');
    await onDisconnected();
  }, onError: (error) async {
    // counter = 0;
    debugPrint('ws error $error');
    await onDisconnected();
  });
}

void onMessage(data) async {
  //To Do
  await parseTCPResponse(jsonDecode);
}

//Reconnect websocket in 1 seconds
onDisconnected() async {
   widget.channel.sink.close();
  print("Disconnected, trying again in 2s");
  new Timer(new Duration(seconds: 2), () async {
    await connect();
  });
}

connect() async {
  try {
    IOWebSocketChannel channel = IOWebSocketChannel.connect(HttpService.wsUrl);
    Stream stream = channel.stream.asBroadcastStream();
    await Future.delayed(Duration(milliseconds: 1000));
    await connectionRequest();
  } catch (e) {
    print("Error! can not connect WS connectWs " + e.toString());
    await Future.delayed(Duration(milliseconds: 1000));
    IOWebSocketChannel channel = IOWebSocketChannel.connect(HttpService.wsUrl);
    Stream stream = channel.stream.asBroadcastStream();
    await connectionRequest();
  }
}

@override
void dispose() {
  MyApp.channel.sink.close();
  dispose();
}

Используя приведенный выше код, я подключал все другие виджеты с помощью streamBuilder к общему Steam, созданному выше. Проблема здесь в том, что при попытке выйти и повторно войти в систему я использовал вышеупомянутый метод connect() для инициализации потока канала. При этом я получаю сообщение об ошибке, как показано ниже

I / flutter (15477): отправлен запрос на соединение. I / flutter (15477): Ошибка! не удается подключиться к WS connectW. Плохое состояние: Невозможно добавить событие после закрытия. I / flutter (15477): Запрос на соединение отправлен E / flutter (15477): [ОШИБКА:flutter / lib / ui / ui_dart_state.cc(177)] Необработанное исключение: Плохо состояние: Невозможно добавить событие после закрытия E / flutter (15477): #0 _StreamController.add (dart:async / stream_controller.dart:623:24)

Есть указатели, где что-то не так?

1 ответ

Я сталкиваюсь с той же проблемой прямо сейчас. Но я нашел решение для этого.

Вы можете закрыть соединение и повторно подключить веб-сокет до метода web socket.listener.

Например:

      void websocketFunction() {
     channel.sink.close();
          channel = WebSocketChannel.connect(
            Uri.parse('wss://12.251.145.12:25008'),
          );
          socketListener= channel.stream.listen((event) async {
            var decodedJson = json.decode(event);
            if (
            decodedJson["data"]["location_id"].toString() ==
                locationId.toString()
                && decodedJson["type"].toString() == "order.created"
            ) {
              Provider.of<OrderProvider>(context, listen: false).getAllOrders(
                  locationId);
            } else {
              debugPrint("not new order " + event.toString());
            }
          });
}
Другие вопросы по тегам