Mason brick with clean architecture feature
This brick generates the folder structure and empty classes for the new feature according to the clean architecture. Using this brick implies that you have the following folder structure in your project: lib/features/[feature_folder]
.
Getting Started
- Make sure you have Mason installed. installation guide
dart pub global activate mason_cli
NOTE: The following commands assume that you are in the project directory (where pubspec.yaml is located)
- Initialize mason in the current directory. This will generate a mason.yaml and allow mason to work with bricks scoped locally within the workspace.
mason init
- Add brick to
mason.yaml
file.
mason add feature_clean_architecture --git-url https://github.com/alvo2k/mason_feature_clean_architecture
- Let him cook.
mason make feature_clean_architecture
or
mason make feature_clean_architecture \
--feature_name "example brick" \
--generate_barrel_files true \
--use_equatable true \
--use_injectable false \
--use_json_serializable true \
--use_bloc true
Variables β¨
The following table outlines the variables that can be used when generating a new feature folder:
Variable | Description | Required | Type | Default |
---|---|---|---|---|
feature_name | Name of the feature | Yes | string | "example brick" |
generate_barrel_files | A barrel file is a collection of export statements for ease of importing. | No | bool | false |
use_equatable | Whether to use the Equatable package. | No | bool | true |
use_injectable | Whether to use the Injectable package (get_it generator). | No | bool | false |
use_json_serializable | Whether to use the json_serializable package. | No | bool | true |
use_bloc | Whether to use the flutter_bloc package (cubit is also supported). | No | bool | true |
Outputs π¦
The generated folder architecture will look like this:
lib/features/example_brick/
βββ data
β βββ datasources
β β βββ example_brick_data_source.dart
β βββ models
β β βββ example_brick_model.dart
β β βββ models.dart
β βββ repositories
β βββ example_brick_repository_impl.dart
βββ domain
β βββ entities
β β βββ entities.dart
β β βββ example_brick.dart
β βββ repositories
β β βββ example_brick_repository.dart
β βββ usecases
β β βββ example_brick_usecase.dart
β β βββ usecases.dart
β βββ view.dart
βββ presentation
βββ bloc
β βββ example_brick_bloc.dart
β βββ example_brick_event.dart
β βββ example_brick_state.dart
βββ pages
β βββ example_brick_page.dart
βββ widgets
βββ example_brick.dart
βββ view.dart
Bloc events types
Abstract:
part of 'example_brick_bloc.dart';
abstract class ExampleBrickEvent extends Equatable {}
class LoadExampleBrick extends ExampleBrickEvent {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
Sealed:
part of 'example_brick_bloc.dart';
sealed class ExampleBrickEvent extends Equatable {}
final class LoadExampleBrick extends ExampleBrickEvent {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
Bloc state types
Abstract:
part of 'example_brick_bloc.dart';
abstract class ExampleBrickState extends Equatable {}
class ExampleBrickInitial extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
class ExampleBrickLoading extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
class ExampleBrickLoaded extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
Sealed:
part of 'example_brick_bloc.dart';
sealed class ExampleBrickState extends Equatable {}
final class ExampleBrickInitial extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
final class ExampleBrickLoading extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
final class ExampleBrickLoaded extends ExampleBrickState {
@override
// TODO: implement props
List<Object?> get props => throw UnimplementedError();
}
Enum:
part of 'example_brick_bloc.dart';
class ExampleBrickState extends Equatable {
const ExampleBrickState._({
required this.status,
});
const ExampleBrickState.initial()
: this._(status: ExampleBrickStatus.initial);
final ExampleBrickStatus status;
@override
List<Object?> get props => [status];
ExampleBrickState copyWith(
ExampleBrickStatus? status,
) =>
ExampleBrickState._(
status: status ?? this.status,
);
}
enum ExampleBrickStatus { initial, loading, loaded }