import 'dart:typed_data'; import 'dart:html' as html; import 'package:wukongimfluttersdk/common/logs.dart'; import 'package:wukongimfluttersdk/manager/my_wk_socket_base.dart'; class MyH5WKSocket implements MyWkSocketBase { html.WebSocket? _socket; // 将 _socket 声明为可空类型 bool _isListening = false; static MyH5WKSocket? _instance; MyH5WKSocket._internal(this._socket); factory MyH5WKSocket.newSocket(String url) { var socket = html.WebSocket(url); _instance ??= MyH5WKSocket._internal(socket); return _instance!; } @override void close() { _isListening = false; _instance = null; try { _socket?.close(); } finally { _socket = null; // 现在可以将 _socket 设置为 null } } @override void listen( {required Function(Uint8List data) onData, required Function() onOpen, required Function() error}) { if (!_isListening && _socket != null) { _socket!.onMessage.listen((message) { if (message.data is html.Blob) { html.Blob blobData = message.data as html.Blob; // 使用 FileReader 来读取 Blob html.FileReader reader = html.FileReader(); reader.readAsArrayBuffer(blobData); // 监听读取完成事件 reader.onLoadEnd.listen((event) { // 获取 ArrayBuffer 数据 Uint8List uint8List = reader.result as Uint8List; onData(uint8List); // 你可以继续使用 uint8List 进行其他操作 }); } else { // 处理非 Blob 类型数据 Logs.debug("---> Received non-Blob message: ${message.data}"); } }); _socket!.onOpen.listen((data) { Logs.debug("---> $data,状态: ${_socket?.readyState}"); onOpen(); }); _socket!.onError.listen((data) { Logs.debug('socket断开了 : ${data.toString()}'); }); _socket!.onClose.listen((data) { Logs.debug( 'socket close 关闭了 : ${data.toString()} ,状态: ${_socket?.readyState}', ); close(); // 关闭和重置 Socket 连接 error(); }); _isListening = true; } } @override send(Uint8List data) { try { if (_socket != null) { _socket?.send(data); // 使用安全调用操作符 } } catch (e) { Logs.debug('发送消息错误$e'); } } }