import 'package:socket_io_client/socket_io_client.dart' as IO;
class SocketManager {
static final SocketManager _instance = SocketManager._internal();
factory SocketManager() => _instance;
IO.Socket? _socket;
SocketManager._internal();
// Метод для создания или получения экземпляра соединения
IO.Socket get socket {
if (_socket == null) {
_socket = IO.io('https://your_socket_server_url');
}
return _socket!;
}
}
import 'package:flutter/material.dart';
import 'package:your_project_name/socket_manager.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FirstPage(),
);
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Получение соединения Socket.IO
final socket = SocketManager().socket;
return Scaffold(
appBar: AppBar(title: Text('First Page')),
body: Center(
child: ElevatedButton(
onPressed: () {
// Подключение к Socket.IO серверу
socket.connect();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Go to Second Page'),
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Получение соединения Socket.IO
final socket = SocketManager().socket;
return Scaffold(
appBar: AppBar(title: Text('Second Page')),
body: Center(
child: ElevatedButton(
onPressed: () {
// Отключение от Socket.IO сервера
socket.disconnect();
Navigator.pop(context);
},
child: Text('Go back to First Page'),
),
),
);
}
}
В приведенном примере был применен паттерн Singleton (Одиночка). Паттерн Singleton обеспечивает, чтобы класс имел только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру. Это позволяет обеспечить, чтобы все клиенты обращались к одному и тому же экземпляру класса и избежать создания дубликатов объектов.
В классе SocketManager используется приватный конструктор (SocketManager._internal()) и фабричный метод (factory SocketManager() => _instance) для создания единственного экземпляра класса. При первом вызове SocketManager() создается только один экземпляр SocketManager, и все последующие вызовы будут возвращать этот же экземпляр. Таким образом, гарантируется, что у нас есть только один объект для управления соединением IO.Socket, и этот объект доступен глобально через SocketManager().socket.