// ignore_for_file: prefer_final_fields import 'package:protobuf/protobuf.dart'; abstract class Communicator { Map _handlerDic = {}; late Map)> _instanceGenerator; Communicator(); void initialize(Map)> instanceGenerator) { _instanceGenerator = instanceGenerator; } T Function(List) getGenerator(String type) { if(!_instanceGenerator.containsKey(type)) { throw Exception('Must set protobuf packet creator before use it. Type: ${(T).toString()}'); } return _instanceGenerator[type] as T Function(List); } Future send(T data); void onReceivedData(String typeName, List data) { if( _handlerDic.containsKey(typeName) ) { _handlerDic[typeName]?.onMessage(data); } } void addListener(void Function(T) listener) { var type = T.toString(); if(!_handlerDic.containsKey(type)) { _handlerDic[type] = DataHandler(getGenerator(type)); } var handler = _handlerDic[type] as DataHandler; handler.addListener(listener); } void removeListener(void Function(T) listener) { var type = T.toString(); if(_handlerDic.containsKey(type)) { var handler = _handlerDic[type] as DataHandler; handler.removeListener(listener); } } } abstract class IDataHandler { void onMessage(List data); } class DataHandler implements IDataHandler { T Function(List) _generator; List _listeners = []; DataHandler(this._generator); @override void onMessage(List data) { for(var listener in _listeners) { listener.call(_generator(data)); } } void addListener(void Function(T) handler) { removeListener(handler); //중복 리스너 불허 _listeners.add(handler); } void removeListener(void Function(T) handler) { _listeners.remove(handler); } }