dispatch method

  1. @override
Future dispatch(
  1. String methodName, [
  2. dynamic positionalParams,
  3. Map<String, dynamic>? namedParams
])

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;
}