微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关闭 Webscoket 通道后无法连接 - Flutter

如何解决关闭 Webscoket 通道后无法连接 - Flutter

我正在创建一个 Web 套接字流广播,可在 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 将所有其他小部件与上面创建的公共流连接起来。这里的问题是在尝试注销并重新登录时,我使用了上面的 connect() 方法来初始化通道流。这样做时出现如下错误

I/Flutter (15477):发送连接请求 I/Flutter (15477):错误!无法连接 WS connectWs 错误状态:关闭后无法添加事件 I/Flutter (15477):已发送连接请求 E/Flutter (15477): [ERROR:Flutter/lib/ui/ui_dart_state.cc(177)] 未处理异常:状态错误关闭后无法添加事件 E/Flutter (15477): #0 _StreamController.add (dart:async/stream_controller.dart:623:24)

有什么地方出错了吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。