Задать вопрос
exeshka
@exeshka
Учусь писать на python

Как использовать одно соединение socket.io?

Уже долго мучаюсь с проблемой того что не понимаю как использовать 1 соединение на разных страницах проекта.
Пожалуйста киньте небольшой пример
  • Вопрос задан
  • 112 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы