generateBlocStateTemplate method
Generates BLoC state template.
Creates state classes for different API call states with proper stream/future handling based on method type.
Parameters:
config: API generation configuration
Implementation
String generateBlocStateTemplate(ApiGenerationConfig config) {
final bodyClass =
typeResolver.resolveBodyClass(config.apiClassName, config.bodyList);
final entityClass = typeResolver.resolveEntityClass(config);
return '''part of '${config.apiName}_bloc.dart';
@immutable
abstract class ${config.apiClassName}State extends Equatable {
bool get isInitial => this is ${config.apiClassName}Initial;
bool get isLoading => this is ${config.apiClassName}Loading;
bool get isFailed => this is ${config.apiClassName}Failed;
bool get isSuccess => this is ${config.apiClassName}Success;
bool get isCanceled => this is ${config.apiClassName}Canceled;
${typeResolver.whenMethod(
config.method,
onStream: () {
return '''bool get isStream => this is ${config.apiClassName}Stream;
bool get isPaused => this is ${config.apiClassName}Paused;
bool get isResumed => this is ${config.apiClassName}Resumed;''';
},
onFuture: () => '',
)}
bool get isNotInitial => this is! ${config.apiClassName}Initial;
bool get isNotLoading => this is! ${config.apiClassName}Loading;
bool get isNotFailed => this is! ${config.apiClassName}Failed;
bool get isNotSuccess => this is! ${config.apiClassName}Success;
bool get isNotCanceled => this is! ${config.apiClassName}Canceled;
${typeResolver.whenMethod(
config.method,
onStream: () {
return '''bool get isNotStream => this is! ${config.apiClassName}Stream;
bool get isNotPaused => this is! ${config.apiClassName}Paused;
bool get isNotResumed => this is! ${config.apiClassName}Resumed;''';
},
onFuture: () => '',
)}
void when({
void Function(${config.apiClassName}Initial state)? onInitial,
void Function(${config.apiClassName}Loading state)? onLoading,
void Function(${config.apiClassName}Failed state)? onFailed,
void Function(${config.apiClassName}Success state)? onSuccess,
void Function(${config.apiClassName}Canceled state)? onCanceled,
${typeResolver.whenMethod(
config.method,
onStream: () {
return '''void Function(${config.apiClassName}Stream state)? onStream,
void Function(${config.apiClassName}Paused state)? onPaused,
void Function(${config.apiClassName}Resumed state)? onResumed,''';
},
onFuture: () => '',
)}
}) {
final state = this;
if (state is ${config.apiClassName}Initial) {
onInitial?.call(state);
} else if (state is ${config.apiClassName}Loading) {
onLoading?.call(state);
} else if (state is ${config.apiClassName}Failed) {
onFailed?.call(state);
} else if (state is ${config.apiClassName}Success) {
onSuccess?.call(state);
} else if (state is ${config.apiClassName}Canceled) {
onCanceled?.call(state);
} ${typeResolver.whenMethod(
config.method,
onStream: () {
return '''else if (state is ${config.apiClassName}Stream) {
onStream?.call(state);
} else if (state is ${config.apiClassName}Paused) {
onPaused?.call(state);
} else if (state is ${config.apiClassName}Resumed) {
onResumed?.call(state);
}''';
},
onFuture: () => '',
)}
}
Widget builder({
Widget Function(${config.apiClassName}Initial state)? onInitial,
Widget Function(${config.apiClassName}Loading state)? onLoading,
Widget Function(${config.apiClassName}Failed state)? onFailed,
Widget Function(${config.apiClassName}Success state)? onSuccess,
Widget Function(${config.apiClassName}Canceled state)? onCanceled,
${typeResolver.whenMethod(
config.method,
onStream: () {
return '''Widget Function(${config.apiClassName}Stream state)? onStream,
Widget Function(${config.apiClassName}Paused state)? onPaused,
Widget Function(${config.apiClassName}Resumed state)? onResumed,''';
},
onFuture: () => '',
)}
Widget Function(${config.apiClassName}State state)? onStateBuilder,
}) {
final state = this;
final defaultWidget = onStateBuilder?.call(this) ?? const SizedBox.shrink();
if (state is ${config.apiClassName}Initial) {
return onInitial?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Loading) {
return onLoading?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Failed) {
return onFailed?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Success) {
return onSuccess?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Canceled) {
return onCanceled?.call(state) ?? defaultWidget;
} ${typeResolver.whenMethod(
config.method,
onStream: () {
return '''else if (state is ${config.apiClassName}Stream) {
return onStream?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Paused) {
return onPaused?.call(state) ?? defaultWidget;
} else if (state is ${config.apiClassName}Resumed) {
return onResumed?.call(state) ?? defaultWidget;
}''';
},
onFuture: () => '',
)}
else {
return defaultWidget;
}
}
}
class ${config.apiClassName}Initial extends ${config.apiClassName}State {
@override
List<Object?> get props => [];
}
class ${config.apiClassName}Loading extends ${config.apiClassName}State {
${config.apiClassName}Loading(this.body, this.headers, this.extra,);
final $bodyClass body;
final Map<String, String>? headers;
final dynamic extra;
@override
List<Object?> get props => [body, headers, extra,];
}
class ${config.apiClassName}Failed extends ${config.apiClassName}State {
${config.apiClassName}Failed(this.body, this.headers, this.failure, this.extra,);
final $bodyClass body;
final Map<String, String>? headers;
final MorphemeFailure failure;
final dynamic extra;
@override
List<Object?> get props => [body, headers, failure, extra,];
}
class ${config.apiClassName}Canceled extends ${config.apiClassName}State {
${config.apiClassName}Canceled(this.extra);
final dynamic extra;
@override
List<Object?> get props => [extra];
}
${typeResolver.whenMethod(
config.method,
onStream: () {
return '''class ${config.apiClassName}Stream extends ${config.apiClassName}State {
${config.apiClassName}Stream(this.body, this.headers, this.data, this.extra,);
final $bodyClass body;
final Map<String, String>? headers;
final $entityClass data;
final dynamic extra;
@override
List<Object?> get props => [body, headers, data, extra,];
}
class ${config.apiClassName}Paused extends ${config.apiClassName}State {
${config.apiClassName}Paused(this.extra);
final dynamic extra;
@override
List<Object?> get props => [extra];
}
class ${config.apiClassName}Resumed extends ${config.apiClassName}State {
${config.apiClassName}Resumed(this.extra);
final dynamic extra;
@override
List<Object?> get props => [extra];
}
class ${config.apiClassName}Success extends ${config.apiClassName}State {
${config.apiClassName}Success(this.body, this.headers, this.data, this.extra,);
final $bodyClass body;
final Map<String, String>? headers;
final List<$entityClass> data;
final dynamic extra;
@override
List<Object?> get props => [body, headers, data, extra,];
}''';
},
onFuture: () =>
'''class ${config.apiClassName}Success extends ${config.apiClassName}State {
${config.apiClassName}Success(this.body, this.headers, this.data, this.extra,);
final $bodyClass body;
final Map<String, String>? headers;
final $entityClass data;
final dynamic extra;
@override
List<Object?> get props => [body, headers, data, extra,];
}''',
)}
''';
}