dispatch method
Invoke named method with parameters on an instance.
return a Future of the result, if possible. Catch, repackage and return (not throw or rethrow) All Errors. positionalParams shall be a List or null. namedParams shall be a Map of String:value or null.
Implementation
@override
Future<dynamic> dispatch(String methodName,
[dynamic positionalParams, Map<String, dynamic>? namedParams]) async {
var posParams = positionalParams ?? [];
if (posParams is Map<String, dynamic>) {
namedParams = positionalParams;
posParams = [];
}
if (posParams is! List) {
posParams = [posParams];
}
namedParams = namedParams ?? <String, dynamic>{};
var symbolMap = <Symbol, dynamic>{};
if (namedParams.isNotEmpty) {
symbolMap = symbolizeKeys(namedParams);
}
var instanceMirror = reflect(instance);
Symbol methodMirror;
try {
methodMirror = getMethodMirror(instanceMirror, methodName);
} on MethodNotFoundException catch (_) {
return MethodNotFoundException('Method not found: $methodName');
}
InstanceMirror t;
try {
t = instanceMirror.invoke(methodMirror, posParams, symbolMap);
} on TypeError catch (e) {
return InvalidParametersException('$e');
} on NoSuchMethodError catch (e) {
return InvalidParametersException('$e');
} on RuntimeException catch (e) {
return e;
} catch (e) // Errors might crash the server
{
return RuntimeException('$e');
}
var resp = await t.reflectee;
return resp;
}