79 lines
1.7 KiB
Dart
79 lines
1.7 KiB
Dart
import 'dart:async';
|
|
|
|
//typedef EventHandler<T> = void Function(T args);
|
|
|
|
/*class _MapEntry {
|
|
late dynamic owner;
|
|
|
|
late dynamic handler;
|
|
}
|
|
|
|
class MessageService {
|
|
static final MessageService _singleton = MessageService._internal();
|
|
|
|
final Map<String, Set<_MapEntry>> _callbackMaps = <String, Set<_MapEntry>>{};
|
|
|
|
factory MessageService() {
|
|
return _singleton;
|
|
}
|
|
|
|
MessageService._internal();
|
|
|
|
subscribe<T>(String topic, dynamic owner, EventHandler<T>? handler) {
|
|
var entry = _MapEntry();
|
|
entry.owner = owner;
|
|
entry.handler = handler;
|
|
|
|
if (_callbackMaps.containsKey(topic)) {
|
|
_callbackMaps[topic]!.remove(entry);
|
|
_callbackMaps[topic]!.add(entry);
|
|
} else {
|
|
_callbackMaps[topic] = <_MapEntry>{};
|
|
_callbackMaps[topic]!.add(entry);
|
|
}
|
|
}
|
|
|
|
unsubscribe<T>(String topic, dynamic owner) {
|
|
if (_callbackMaps.containsKey(topic)) {
|
|
for (var entry in _callbackMaps[topic]!) {
|
|
if (entry.owner == owner) {
|
|
_callbackMaps[topic]!.remove(entry);
|
|
|
|
unsubscribe(topic, owner);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
unsubscribeAll<T>(dynamic owner) {
|
|
for (var callbackMapsEntry in _callbackMaps.entries) {
|
|
for (var entry in callbackMapsEntry.value.toList()) {
|
|
if (entry.owner == owner) {
|
|
_callbackMaps[callbackMapsEntry.key]!.remove(entry);
|
|
|
|
unsubscribeAll(owner);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
publish<T>(String topic, {T? arguments}) async {
|
|
Completer<void> completer = Completer();
|
|
var entries = _callbackMaps[topic];
|
|
|
|
if (entries != null) {
|
|
for (var entry in entries) {
|
|
entry.handler(arguments);
|
|
}
|
|
|
|
completer.complete();
|
|
}
|
|
|
|
await completer.future;
|
|
}
|
|
}*/
|