typedef EventHandler = void Function(T args); class _MapEntry { late dynamic owner; late dynamic handler; } class MessageService { static final MessageService _singleton = MessageService._internal(); final Map> _callbackMaps = >{}; factory MessageService() { return _singleton; } MessageService._internal(); subscribe(String topic, dynamic owner, EventHandler? 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(String topic, dynamic owner) { if (_callbackMaps.containsKey(topic)) { for (var entry in _callbackMaps[topic]!) { if (entry.owner == owner) { _callbackMaps[topic]!.remove(entry); break; } } } } publish(String topic, {T? arguments}) { var entries = _callbackMaps[topic]; if (entries != null) { for (var entry in entries) { entry.handler(arguments); } } } }