execute method

  1. @override
void execute([
  1. TParam? param
])
override

Calls the wrapped handler function with an option input parameter

Implementation

@override
execute([TParam? param]) {
  //print("************ Execute***** canExecute: $_canExecute ***** isExecuting: $_isRunning");

  if (!_canExecute) {
    return;
  }

  if (_isRunning) {
    return;
  } else {
    _isRunning = true;
    _canExecuteSubject.add(false);
  }

  _commandResultsSubject.add(CommandResult<TParam, TResult>(param,
      _includeLastResultInCommandResults ? lastResult : null, null, true));

  assert(
      (!_noParamValue && (param != null || null is TParam) ||
          (_noParamValue && param == null)),
      'You called a RxCommand with no parameters with a parameter or one with a parameter without or a null value!');
  final asyncFunc =
      _noParamValue ? _funcNoParam! : () => _func!(param as TParam);

  asyncFunc().asStream().handleError((error) {
    if (throwExceptions) {
      if (error is Object) {
        _resultsSubject.addError(error);
        _commandResultsSubject.addError(error);
      }
      _isRunning = false;
      _isExecutingSubject.add(
          false); // Has to be done because in this case no command result is queued
      _canExecute = !_executionLocked;
      _canExecuteSubject.add(!_executionLocked);
      return;
    }

    final commandResult = CommandResult<TParam, TResult>(param,
        _includeLastResultInCommandResults ? lastResult : null, error, false);
    _commandResultsSubject.add(commandResult);

    RxCommand.globalExceptionHandler
        ?.call(_debugName, CommandError(param, error));
    RxCommand.loggingHandler?.call(_debugName, commandResult);

    _isRunning = false;
    _canExecute = !_executionLocked;
    _canExecuteSubject.add(!_executionLocked);
  }).listen((result) {
    final commandResult =
        CommandResult<TParam, TResult>(param, result, null, false);
    _commandResultsSubject.add(commandResult);
    lastResult = result;
    _resultsSubject.add(result);

    RxCommand.loggingHandler?.call(_debugName, commandResult);

    _isRunning = false;
    _canExecute = !_executionLocked;
    _canExecuteSubject.add(!_executionLocked);
  });
}