Канал 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());
}
});
}