service_bloc

Dart package for service layer implement with bloc architecture

Usage

Create your own base service bloc

Example

  • User permission
enum UserPermissionLevel {
  invalid,
  normal,
  vip,
}

class UserPermissionLevelCubit extends Cubit<UserPermissionLevel> {
  UserPermissionLevelCubit(UserPermissionLevel initialState)
      : super(UserPermissionLevel.invalid);
}

abstract class UserPermissionRequiredServiceBloc<
ServiceRequestedEvent extends ServiceRequested,
ResponseData> extends ServiceBloc<ServiceRequestedEvent, ResponseData> {
  UserPermissionRequiredServiceBloc({required this.userPermissionLevelCubit,
    EventTransformer<ServiceRequestedEvent>? eventTransformer})
      : super(eventTransformer: eventTransformer);

  final UserPermissionLevelCubit userPermissionLevelCubit;
}

class ProductCheckoutServiceRequested extends ServiceRequested {
  const ProductCheckoutServiceRequested(this.productIdList);

  final List<String> productIdList;

  @override
  List<Object?> get props => [productIdList];
}

class ProductCheckoutServiceBloc extends UserPermissionRequiredServiceBloc<
    ProductCheckoutServiceRequested,
    String> {
  ProductCheckoutServiceBloc({required UserPermissionLevelCubit userPermissionLevelCubit})
      : super(userPermissionLevelCubit: userPermissionLevelCubit);

  @override
  FutureOr<void> onRequest(ProductCheckoutServiceRequested event, Emitter<ServiceState> emit) {
    if (userPermissionLevelCubit.state == UserPermissionLevel.invalid) {
      // TODO: implement permission error
    }
    // TODO: implement onRequest
  }
}
  • Locale
class LocaleRequiredServiceRequested extends ServiceRequested {
  LocaleRequiredServiceRequested({required this.locale});

  final Locale locale;

  @override
  List<Object?> get props => [locale];
}

abstract class LocaleRequiredServiceBloc<
ServiceRequested extends LocaleRequiredServiceRequested,
ResponseData> extends ServiceBloc<ServiceRequested, ResponseData> {}

class ProductDetailServiceRequested extends LocaleRequiredServiceRequested {
  ProductDetailServiceRequested({
    required this.productId,
    required Locale locale,
  }) : super(locale: locale);

  final String productId;

  @override
  List<Object?> get props =>
      [
        locale,
        productId,
      ];
}

class ProductDetailServiceBloc extends LocaleRequiredServiceBloc<
    ProductDetailServiceRequested,
    ProductDetail> {
  @override
  FutureOr<void> onRequest(ProductDetailServiceRequested event, Emitter<ServiceState> emit) {
    final locale = event.locale;
    // TODO: implement onRequest
  }
}

This two examples shows that you can create your own service bloc with extensibility feature.

Live Template

Generating boilerplate for service bloc

You can generate service bloc boilerplate code easily by using live template, check out setup to create your own shortcut with the following code.

class $SERVICE_NAME$ServiceRequested extends ServiceRequested {
  const $SERVICE_NAME$ServiceRequested();
  
  @override
  List<Object?> get props => [];
}

class $SERVICE_NAME$ServiceBloc extends ServiceBloc<$SERVICE_NAME$ServiceRequested, $RETURN_TYPE$> {

  @override
  FutureOr<void> onRequest($SERVICE_NAME$ServiceRequested event, Emitter<ServiceState> emit) async {
    $END$// TODO: implement service call
  }
}

For more example detail, please check out example.

Maintainer

Jack Liu

Libraries

service_bloc