Начальный коммит
This commit is contained in:
88
lib/services/api/socket_service.dart0
Normal file
88
lib/services/api/socket_service.dart0
Normal file
@@ -0,0 +1,88 @@
|
||||
// lib/services/api/socket_service.dart
|
||||
import 'dart:convert';
|
||||
import 'package:flutter_stocky/utils/constants.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:web_socket_channel/web_socket_channel.dart';
|
||||
|
||||
class SocketService extends GetxService {
|
||||
final String _baseUrl = Constants.BASE_SOCKET_URL;
|
||||
WebSocketChannel? _channel;
|
||||
bool _connected = false;
|
||||
|
||||
// Поток для получения сообщений
|
||||
StreamController<Map<String, dynamic>> _messageController =
|
||||
StreamController.broadcast();
|
||||
|
||||
Stream<Map<String, dynamic>> get messages => _messageController.stream;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
connect();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
_disconnect();
|
||||
_messageController.close();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void connect() async {
|
||||
if (_connected) return;
|
||||
|
||||
try {
|
||||
_channel = WebSocketChannel.connect(Uri.parse('$_baseUrl/ws'));
|
||||
_channel!.stream.listen(
|
||||
(message) {
|
||||
final data = json.decode(message);
|
||||
_messageController.add(data);
|
||||
},
|
||||
onDone: () {
|
||||
_connected = false;
|
||||
debugPrint('WebSocket отключен');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('WebSocket ошибка: $error');
|
||||
_connected = false;
|
||||
// Автоподключение через 3 сек
|
||||
Future.delayed(const Duration(seconds: 3), connect);
|
||||
},
|
||||
);
|
||||
|
||||
_connected = true;
|
||||
debugPrint('WebSocket подключен');
|
||||
} catch (e) {
|
||||
debugPrint('Ошибка подключения к WebSocket: $e');
|
||||
}
|
||||
}
|
||||
|
||||
void _disconnect() {
|
||||
_channel?.close();
|
||||
_channel = null;
|
||||
_connected = false;
|
||||
}
|
||||
|
||||
void sendMessage(Map<String, dynamic> message) {
|
||||
if (_connected && _channel != null) {
|
||||
_channel?.sink.add(json.encode(message));
|
||||
}
|
||||
}
|
||||
|
||||
// Пример: отправить обновление задачи
|
||||
void notifyTaskUpdate(String taskId) {
|
||||
sendMessage({'type': 'task_updated', 'task_id': taskId});
|
||||
}
|
||||
|
||||
// Пример: подписаться на изменения задач
|
||||
void subscribeToTasks() {
|
||||
sendMessage({'type': 'subscribe', 'entity': 'tasks'});
|
||||
}
|
||||
|
||||
// Пример: уведомить о создании задачи
|
||||
void notifyTaskCreated(Task task) {
|
||||
sendMessage({'type': 'task_created', 'data': task.toJson()});
|
||||
}
|
||||
|
||||
bool get isConnected => _connected;
|
||||
}
|
||||
Reference in New Issue
Block a user