I’m encountering an issue with an anonymous closure when Socket.IO connects in Flutter. Also when i make http requests i got the same issue.
Error:
I/flutter (26516): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (26516): │ #0 new SocketClient._internal. (package:game/connection/controller/socket_client.dart:25:14)
I/flutter (26516): │ #1 EventEmitter.emit. (package:socket_io_common/src/util/event_emitter.dart:61:14)
I/flutter (26516): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (26516): │ ???? Connected to server
I/flutter (26516): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class SocketClient {
Socket? socket;
static SocketClient? _instance;
bool isDisconnectDialogVisible = false;
SocketClient._internal() {
socket = io(
dotenv.env['BASE_URL']!,
OptionBuilder()
.setTransports(['websocket'])
.disableAutoConnect()
.enableForceNew()
.setExtraHeaders({'token': dotenv.env['SOCKET_TOKEN']!})
.build(),
);
socket!.onConnect((_) {
logger.i('Connected to server');
});
socket!.onDisconnect((_) {
showDisconnectDialog();
logger.i('Disconnected from server');
reconnect();
});
socket!.on('error', (data) {
logger.e('WebSocket error: $data');
Get.dialog(showConnectionErr(), barrierDismissible: false);
socket?.disconnect();
reconnect();
});
socket!.connect();
}
void showDisconnectDialog() {
if (!isDisconnectDialogVisible) {
isDisconnectDialogVisible = true;
Get.dialog(
showConnectionErr(),
barrierDismissible: false,
).then((_) {
isDisconnectDialogVisible = false;
});
}
}
void reconnect() {
Future.delayed(const Duration(seconds: 5), () {
if (!isDisconnectDialogVisible) {
socket?.connect();
} else {
reconnect(); // If dialog is visible, wait and try again
}
});
}
static SocketClient get instance {
_instance ??= SocketClient._internal();
return _instance!;
}
}