buildFacadeCommandClassWidgetRef method

String buildFacadeCommandClassWidgetRef()

Implementation

String buildFacadeCommandClassWidgetRef() {
  final hasFamily = _hasFamily;
  final hasParentAndFamily = _hasParent && hasFamily;

  String constructorParams;
  if (hasParentAndFamily) {
    constructorParams = '(this._ref, this._instance, this._familyArg)';
  } else if (_hasParent) {
    constructorParams = '(this._ref, this._instance)';
  } else if (hasFamily) {
    constructorParams = '(this._ref, this._familyArg)';
  } else {
    constructorParams = '(this._ref)';
  }

  final instanceField = _hasParent ? 'final ${parent!.name} _instance;' : '';
  final familyField = hasFamily
      ? 'final ${_familyParams.toRecordType()} _familyArg;'
      : '';

  final refField = 'final WidgetRef _ref;';

  String commandInitialization;
  if (hasParentAndFamily) {
    commandInitialization =
        'late final _command = _instance._\$${command.name}Command(_familyArg);';
  } else if (_hasParent) {
    commandInitialization =
        'late final _command = _instance._\$${command.name}Command;';
  } else if (hasFamily) {
    commandInitialization =
        'late final _command = _\$${command.name}Command(_familyArg);';
  } else {
    commandInitialization =
        'late final _command = _\$${command.name}Command;';
  }

  // run() takes non-family params only
  // When no params, call run() without arguments but add(()) internally
  final hasNonFamilyParams = _nonFamilyParams.isNotEmpty;
  final runParams = hasNonFamilyParams
      ? _nonFamilyParams.toParameterSignature()
      : '';
  final runArgs = hasNonFamilyParams
      ? _nonFamilyParams.toRecordValue()
      : '()';

  return '''
class $facadeCommandClassNameWidgetRef implements CommandProviderFacade<${command.dataType}, ${command.nonFamilyParams.isEmpty ? '()' : command.nonFamilyParams.toRecordType()}>, CommandProviderValue<${command.dataType}, ${command.nonFamilyParams.isEmpty ? '()' : command.nonFamilyParams.toRecordType()}> {
$facadeCommandClassNameWidgetRef$constructorParams;
$instanceField
$familyField
$refField

$commandInitialization

@override
${command.stateType} read() => _ref.read(_command);
@override
${command.stateType} watch() => _ref.watch(_command);

SelectedWidgetRefFacade<R> select<R>(R Function(${command.stateType} state) selector) =>
    SelectedWidgetRefFacade(_ref, _command.select(selector));

void run($runParams) => _ref.read(_command.notifier).add($runArgs);
@override
void reset() => _ref.read(_command.notifier).reset();
@override
void retry() => _ref.read(_command.notifier).retry();
@override
void invalidate() => _ref.invalidate(_command);
@override
void listen(
  void Function(${command.nullableStateType} previous, ${command.stateType} next) listener, {
  void Function(Object, StackTrace)? onError,
  bool fireImmediately = false,
}) {
  _ref.listen(_command, listener, onError: onError);
}

@override
CommandProviderFacade<${command.dataType}, ${command.nonFamilyParams.isEmpty ? '()' : command.nonFamilyParams.toRecordType()}> of(WidgetRef ref) => $facadeCommandClassNameWidgetRef(ref${_hasParent ? ', _instance' : ''}${hasFamily ? ', _familyArg' : ''});
}''';
}